加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 08:14:11 所属栏目:百科 来源:网络整理
导读:任何人都有任何想法为什么下面的代码示例失败与一个XmlException“根级别的数据无效。行1,位置1。 var body = "?xml version="1.0" encoding="utf-16"?Report ......"XmlDocument bodyDoc = new XmlDocument(); bodyDoc.LoadXml(body); 背景 虽然你的问题确
任何人都有任何想法为什么下面的代码示例失败与一个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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读