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