为什么当包含XML头时C#XmlDocument.LoadXml(String)会失败?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (53)

是否有人知道以下代码示例在根级的XmlException“数据无效时失败的原因。第1行,位置1。

var body = "<?xml version="1.0" encoding="utf-16"?><Report> ......"
XmlDocument bodyDoc = new XmlDocument();            
bodyDoc.LoadXml(body);
提问于
用户回答回答于

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("sample.xml");
用户回答回答于

我的代码如下所示:

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"?>

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

这个问题的解决方案是确保在传递Load或LoadXml方法中使用的编码与您在XML头中所说的匹配。在上面的示例中,要么将xml头更改为状态utf-16,要么在utf-8中对输入进行编码,并使用XmlDocument.Load方法.下面是示例代码,

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);

扫码关注云+社区