虽然您的问题确实将编码设置为UTF-16,但您没有正确转义字符串,因此我不确定您是否确实将字符串准确地转换为您的问题.
我遇到了同样的例外:
System.Xml.XmlException:根级别的数据无效.第1行,第1位.
但是,我的代码看起来像这样:
string xml = "\nThis is a Test "; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xml);
问题是字符串在.NET内部存储为UTF-16,但XML文档头中指定的编码可能不同.例如:
从这里的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 = "\nThis is a Test "; // 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);
简单有效的解决方案:使用该LoadXml()
方法而不是使用该Load()
方法
例如:
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("sample.xml");
试试这个:
XmlDocument bodyDoc = new XmlDocument(); bodyDoc.XMLResolver = null; bodyDoc.Load(body);
我想到了.阅读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);