为什么当包括XML标头时,C#XmlDocument.LoadXml(string)失败?

前端之家收集整理的这篇文章主要介绍了为什么当包括XML标头时,C#XmlDocument.LoadXml(string)失败?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
任何人都有任何想法为什么下面的代码示例失败与一个XmlException“根级别的数据无效。行1,位置1。
var body = "<?xml version="1.0" encoding="utf-16"?><Report> ......"
XmlDocument bodyDoc = new XmlDocument();            
bodyDoc.LoadXml(body);
背景

虽然你的问题确实有编码设置为UTF-16,你没有正确转义的字符串,所以我不知道你是否,事实上,准确地将字符串转置到你的问题。

我遇到了同样的例外:

System.Xml.XmlException: Data at the
root level is invalid. Line 1,
position 1.

但是,我的代码看起来像这样:

string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<event>This is a Test</event>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);

问题

问题是字符串在.NET内部存储为UTF-16,但是XML文档头中指定的编码可能不同。例如。:

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

从String here的MSDN文档:

Each Unicode character in a string is
defined by a Unicode scalar value,
also called a Unicode code point or
the ordinal (numeric) value of the
Unicode character. Each code point is
encoded using UTF-16 encoding,and the
numeric value of each element of the
encoding is represented by a Char
object.

这意味着当你传递XmlDocument.LoadXml()你的字符串与XML标题,它必须说,编码是UTF-16。否则,实际底层编码将不匹配报头中报告的编码,并将导致抛出XmlException。

解决方

这个问题的解决方案是确保在传递Load或LoadXml方法时使用的编码与您在XML标题中说的一致。在上面的示例中,将XML标题更改为状态UTF-16或将输入编码为UTF-8,并使用XmlDocument.Load methods之一。

下面是示例代码演示如何使用MemoryStream构建一个XmlDocument使用一个字符串定义一个UTF-8编码XML文档(当然,存储一个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);

猜你在找的XML相关文章