有没有人知道为什么以下代码示例失败并出现XmlException"根级别的数据无效.第1行,第1行"
var body = "<?xml version="1.0" encoding="utf-16"?><Report> ......"
XmlDocument bodyDoc = new XmlDocument();
bodyDoc.LoadXml(body);
Run Code Online (Sandbox Code Playgroud)
Zac*_*ame 117
虽然您的问题确实将编码设置为UTF-16,但您没有正确转义字符串,因此我不确定您是否确实将字符串准确地转换为您的问题.
我遇到了同样的例外:
System.Xml.XmlException:根级别的数据无效.第1行,第1位.
但是,我的代码看起来像这样:
string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<event>This is a Test</event>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
Run Code Online (Sandbox Code Playgroud)
问题是字符串在.NET内部存储为UTF-16,但XML文档头中指定的编码可能不同.例如:
<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)
从这里的String的MSDN文档:
字符串中的每个Unicode字符都由Unicode标量值定义,也称为Unicode代码点或Unicode字符的序数(数字)值.每个代码点使用UTF-16编码进行编码,编码的每个元素的数值由Char对象表示.
这意味着当您使用XML标头传递XmlDocument.LoadXml()时,必须说编码是UTF-16.否则,实际的基础编码将与标头中报告的编码不匹配,并将导致抛出XmlException.
此问题的解决方案是确保在传递Load或LoadXml方法的任何内容中使用的编码与您在XML标头中的说法相匹配.在上面的示例中,要么将XML标头更改为UTF-16状态,要么将输入编码为UTF-8并使用其中一个XmlDocument.Load方法.
下面是演示如何使用MemoryStream使用定义UTF-8编码XML文档的字符串来构建XmlDocument的示例代码(当然,存储的是UTF-16 .NET字符串).
string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<event>This is a Test</event>";
// Encode the XML string in a UTF-8 byte array
byte[] encodedString = Encoding.UTF8.GetBytes(xml);
// Put the byte array into a stream and rewind it to the beginning
MemoryStream ms = new MemoryStream(encodedString);
ms.Flush();
ms.Position = 0;
// Build the XmlDocument from the MemorySteam of UTF-8 encoded bytes
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(ms);
Run Code Online (Sandbox Code Playgroud)
小智 28
简单有效的解决方案:使用该LoadXml()
方法而不是使用该Load()
方法
例如:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("sample.xml");
Run Code Online (Sandbox Code Playgroud)
小智 7
试试这个:
XmlDocument bodyDoc = new XmlDocument();
bodyDoc.XMLResolver = null;
bodyDoc.Load(body);
Run Code Online (Sandbox Code Playgroud)
小智 6
我想到了.阅读MSDN文档,它说从字符串读取时使用.Load而不是LoadXml.发现这个工作100%的时间.奇怪的是,使用StringReader会导致问题.我认为主要原因是这是一个Unicode编码的字符串,可能会导致问题,因为StringReader只是UTF-8.
MemoryStream stream = new MemoryStream();
byte[] data = body.PayloadEncoding.GetBytes(body.Payload);
stream.Write(data, 0, data.Length);
stream.Seek(0, SeekOrigin.Begin);
XmlTextReader reader = new XmlTextReader(stream);
// MSDN reccomends we use Load instead of LoadXml when using in memory XML payloads
bodyDoc.Load(reader);
Run Code Online (Sandbox Code Playgroud)