为什么“根级别的数据无效。第1行,位置1”。对于XML文档?

时间:2013-07-30 12:38:00

标签: .net xml xmldocument xmlreader

我正在使用第三方DLL,它通过互联网传输XML文档。

为什么DLL会抛出以下异常?

  

根级别的数据无效。第1行,第1位。(见下文   完整的异常文本。)

以下是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>

例外:

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:

5 个答案:

答案 0 :(得分:45)

我最终发现有一个字节标记异常并使用此代码将其删除:

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

答案 1 :(得分:11)

我可以给你两个建议:

  1. 您似乎使用“LoadXml”而不是“Load”方法。在某些情况下,它对我有帮助。
  2. 您遇到编码问题。你能检查一下XML文件的编码并写出来吗?

答案 2 :(得分:2)

删除<?xml version="1.0" encoding="utf-8"?>

之前的所有内容

有时,有一些“不可见”(在所有文本编辑器中都不可见)。有些程序会加上这个。

这称为BOM,你可以在这里阅读更多相关信息:https://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

答案 3 :(得分:0)

如果您使用XDocument.Load(url);从另一个域获取xml,主机可能会拒绝请求并返回意外(非xml)结果,这会导致上述XmlException < / p>

请在此处查看我对此可能性的解决方案: XDocument.Load(feedUrl) returns "Data at the root level is invalid. Line 1, position 1."

答案 4 :(得分:0)

此错误的主要原因是逻辑,该逻辑确定将Streambyte[]数组转换为.NET string时的编码。

使用将第二个构造函数参数StreamReader设置为true创建的detectEncodingFromByteOrderMarks,可以确定正确的编码并创建string,而不会破坏XmlDocument.LoadXml方法。

public string GetXmlString(string url)
{
    using var stream = GetResponseStream(url);
    using var reader = new StreamReader(stream, true);
    return reader.ReadToEnd(); // no exception on `LoadXml`
}

常见的错误是仅在UTF8stream上盲目使用byte[]编码。下面的代码将产生string,当在Visual Studio调试器中检查该代码时看起来有效,或者复制粘贴到某个地方,但是如果文件的编码方式不同,则与LoadLoadXml一起使用时,它将产生异常。然后是没有BOM的UTF8。

public string GetXmlString(string url)
{
    byte[] bytes = GetResponseByteArray(url);
    return System.Text.Encoding.UTF8.GetString(bytes); // potentially exception on `LoadXml`
}

因此,对于您的第三方库,他们可能使用第二种方法将XML流解码为string,因此是例外。