当前位置:  开发笔记 > 编程语言 > 正文

为什么包含XML头时C#XmlDocument.LoadXml(字符串)会失败?

如何解决《为什么包含XML头时C#XmlDocument.LoadXml(字符串)会失败?》经验,为你挑选了4个好方法。



1> Zach Burling..:

背景

虽然您的问题确实将编码设置为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);


或者在MemoryStream上使用语句
不要忘记ms.close()
你救了我的一天:D

2> 小智..:

简单有效的解决方案:使用该LoadXml()方法而不是使用该Load()方法

例如:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("sample.xml");



3> 小智..:

试试这个:

XmlDocument bodyDoc = new XmlDocument();
bodyDoc.XMLResolver = null;
bodyDoc.Load(body);



4> 小智..:

我想到了.阅读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);


我相信"如果你想从Stream,String,...加载"这一行的预期目的实际上是"如果你想从一个Stream,File,...加载"但它们有String,因为从一个加载File采用文件名的字符串参数.我不相信他们的意图是"如果你想从内存中的字符串加载XmlDocument,请使用Load".毕竟,这就是LoadXml(String)的既定目的!虽然您的解决方案确实提供了解决方法,但我认为它不能解决XmlDocument.LoadXml(String)中实际陈述的问题(我也有).
推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有