.net xml xmldocument xmlreader

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



xmldocument xmlreader (4)

Eliminar todo antes de <?xml version="1.0" encoding="utf-8"?>

A veces, hay algo "invisible" (no visible en todos los editores de texto). Algunos programas agregan esto.

Se llama BOM, puede leer más sobre esto aquí: https://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

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

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

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

Aquí están las primeras líneas del documento XML:

<?xml version="1.0" encoding="utf-8"?> <REQUEST> <HEADER> <REQUESTID>8a5f6d56-d56d-4b7b-b7bf-afcf89cd970d</REQUESTID> <MESSAGETYPE>101</MESSAGETYPE> <MESSAGEVERSION>3.0.2</MESSAGEVERSION>

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:


Finalmente descubrí que había una excepción de marca de byte 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); }


Te puedo dar dos consejos:

  1. Parece que está usando el método "LoadXml" en lugar del método "Load". En algunos casos, me ayuda.
  2. Tienes un problema de codificación. ¿Podrías revisar la codificación del archivo XML y escribirlo?