28

我正在使用通过 Internet 传输 XML 文档的第三方 DLL。

为什么 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:
4

5 回答 5

50

I eventually figured out there was a byte mark exception and removed it using this code:

 string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
    if (xml.StartsWith(_byteOrderMarkUtf8))
    {
        var lastIndexOfUtf8 = _byteOrderMarkUtf8.Length-1;
        xml = xml.Remove(0, lastIndexOfUtf8);
    }
于 2014-07-01T14:51:35.657 回答
12

我可以给你两个建议:

  1. 看来您使用的是“LoadXml”而不是“Load”方法。在某些情况下,它对我有帮助。
  2. 你有一个编码问题。您可以检查 XML 文件的编码并编写它吗?
于 2013-07-30T12:48:21.887 回答
3

删除之前的所有内容<?xml version="1.0" encoding="utf-8"?>

有时,有一些“不可见”(并非在所有文本编辑器中可见)。一些程序添加了这个。

它被称为 BOM,您可以在此处阅读更多信息:https ://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

于 2016-12-07T20:49:32.733 回答
1

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

在此处查看我对这种可能性的解决方案: XDocument.Load(feedUrl) 返回“根级别的数据无效。第 1 行,位置 1。”

于 2014-11-12T07:33:43.860 回答
1

Stream此错误的主要罪魁祸首是在将数组或byte[]数组转换为 .NET时确定编码的逻辑string

使用StreamReadercreated 并将第二个构造函数参数detectEncodingFromByteOrderMarks设置为 true,将确定正确的编码并创建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`
}

常见的错误是在or上盲目地使用UTF8编码。当在 Visual Studio 调试器中检查或复制粘贴到某处时,下面的代码会产生看起来有效的代码,但是当与没有 BOM 的 UTF8 一起使用或文件的编码方式不同时,它将产生异常。streambyte[]stringLoadLoadXml

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

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

于 2020-10-19T15:11:45.937 回答