XmlDocument和XDocument处理之间的区别�

时间:2015-10-22 17:38:46

标签: c# .net xml linq-to-xml

我一直在尝试加载一个包含一些null('&#x0')字符的xml文件。我试过了 -

  XmlDocument document = new XmlDocument();
  document.LoadXml(xmlString);

XDocument.Load(stringReader);

XmlDocument.LoadXml()方法成功加载xml文档,而XDocument.Load()方法为同一xml字符串提供XmlException

要重现的示例代码:

string xmlFile = @"C:\dummyData.xml";

        string xmlString = File.ReadAllText(xmlFile);

        XmlDocument document = new XmlDocument();
        document.LoadXml(xmlString); //Work

        XDocument.Parse(xmlString); // Didn't work.

        using (StringReader reader = new StringReader(xmlString))
        {
            XDocument.Load(reader);
        }

Xml文件

Copy the content of xml file from here

2 个答案:

答案 0 :(得分:3)

XML中不允许使用字符引用�(至少Microsoft支持的XML 1.0)。但是,对于旧版支持,我认为使用XmlTextReader创建的XmlReaderXmlReaderSettings不检查字符可以加载此类标记。 XmlDocument使用这样的XmlReader而XDocument没有。

答案 1 :(得分:3)

为什么& #x0;是一个问题

根据W3C的定义,Entities

CharRef ::=   '&#' [0-9]+ ';'
            | '&#x' [0-9a-fA-F]+ ';'

乍一看,像�这样的实体看起来不错。

但是你需要阅读定义:

  

[定义:字符引用是指ISO / IEC 10646字符集中的特定字符,例如不能从可用输入设备直接访问的字符。]

因此字符引用需要指向ISO / IEC 10646字符,即linked

  

使用字符引用引用的字符必须与字符的制作匹配。

幸运的是,Char位于同一文件中,并定义为:

Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

因此,正如之前{​​{3}}所述,XML文档中不允许使用C#\0字符或转义版本��

XML解析器现实

某些解析器可能会忽略上述规则的某些部分而不完全符合标准。

问题的真正根源

您发布的XML似乎包含图片/图片:

<?xml version="1.0" encoding="utf-8"?>
<TestData>
        <Images>
            <Drawings>
&lt;?xml version="1.0"?&gt;
&lt;ArrayOfMarkerState &gt;
&lt;/ArrayOfMarkerState&gt;
&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;</Drawings>
        </Images>
            <Date>2015-10-20T17:19:05.2656609+05:30</Date>
</TestData>

像素图形的本质是它们包含二进制数据。

不熟悉XML并且面临在XML中嵌入二进制数据的问题的开发人员将很快认为任何字节都可以编码为&#x00; ... {{1} }。

不幸的是,这是完全错误的。为什么?好吧,因为上面的W3C定义。

除此之外,这对于尺寸来说甚至是一个坏主意。即使它可以工作,像这样编码的字节将占用XML中的6个字节。

解决原始问题

二进制数据不能作为XML实体进入XML文档,所以让我们找到一些可行的,需要小于+ 500%的大小。

答案是Martin Honnen。 Base64的大小增加了+ 33%。

编码47 &#xFF;个字节将导致

&#x0;

只有64字节长,与原来的235字节相比。