Por qué “Los datos en el nivel raíz son inválidos. Línea 1, posición 1. “para documento XML?

Estoy usando una DLL de terceros que transmite un documento XML a través de Internet.

¿Por qué la DLL arrojaría la siguiente excepción?

Los datos a nivel de la raíz no es válida. Línea 1, posición 1. (ver a continuación el texto de excepción completo)

Estas son las primeras líneas del documento XML:

  
8a5f6d56-d56d-4b7b-b7bf-afcf89cd970d 101 3.0.2

Excepción:

 System.ApplicationException was caught Message=Unexpected exception. Source=FooSDK StackTrace: at FooSDK.RequestProcessor.Send(String SocketServerAddress, Int32 port) at Foo.ExecuteRequest(Int32 messageID, IPayload payload, Provider prov) at Foo.SendOrder(Int32 OrderNo) InnerException: System.Xml.XmlException LineNumber=1 LinePosition=1 Message=Data at the root level is invalid. Line 1, position 1. Source=System.Xml SourceUri="" StackTrace: at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.Throw(String res, String arg) at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace() at System.Xml.XmlTextReaderImpl.ParseDocumentContent() at System.Xml.XmlTextReaderImpl.Read() at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace) at System.Xml.XmlDocument.Load(XmlReader reader) at System.Xml.XmlDocument.LoadXml(String xml) at XYZ.RequestProcessor.GetObjectFromXML(String xmlResult) at XYZ.RequestProcessor.Send(String SocketServerAddress, Int32 port) InnerException: 

Eventualmente descubrí que había una excepción de byte mark y la eliminé usando este código:

  string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble()); if (xml.StartsWith(_byteOrderMarkUtf8)) { var lastIndexOfUtf8 = _byteOrderMarkUtf8.Length-1; xml = xml.Remove(0, lastIndexOfUtf8); } 

Puedo darte dos consejos:

  1. Parece que estás usando “LoadXml” en lugar del método “Load”. En algunos casos, me ayuda.
  2. Usted tiene un problema de encoding. ¿Podría verificar la encoding del archivo XML y escribirlo?

¿Eliminar todo antes de la

A veces, hay algunos “invisibles” (no visibles en todos los editores de texto). Algunos progtwigs agregan esto.

Se llama lista de materiales (BOM), puede leer más al respecto aquí: https://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

si está utilizando XDocument.Load(url); para obtener xml de otro dominio, es posible que el host rechace la solicitud y el resultado de retorno e inesperado (no xml), lo que da como resultado la XmlException anterior

Vea mi solución a esta eventualidad aquí: XDocument.Load (feedUrl) devuelve “Los datos en el nivel raíz no son válidos. Línea 1, posición 1.”