XmlDocument.LoadXml和XDocument.Parse之间的不同行为

时间:2010-09-29 09:01:12

标签: c# xml linq-to-xml

我们的项目几天前已转换为使用XmlDocument中的XDocument,但我们发现在使用XDocument.Parse处理属性值中的XML实体时出现奇怪的行为,示例代码如下:

  1. XML字符串:

    string xml = @“< char symbol =”“�”“>”;

  2. XmlDocument.LoadXml代码和结果:

        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(xml);
        Console.WriteLine(xmlDocument.OuterXml);
    

    结果:

    < char symbol =“�” />

  3. XDocument.Parse代码和异常:

        XDocument xDocument = XDocument.Parse(xml);
        Console.WriteLine(xDocument.ToString());
    

    例外:

    System.Xml.dll中发生了'System.Xml.XmlException'类型的第一次机会异常 '。',十六进制值0x00,是无效字符。第1行,第18位。    在System.Xml.XmlTextReaderImpl.Throw(例外e)    在System.Xml.XmlTextReaderImpl.Throw(String res,String [] args)    在System.Xml.XmlTextReaderImpl.Throw(Int32 pos,String res,String [] args)    在System.Xml.XmlTextReaderImpl.ParseNumericCharRefInline(Int32 startPos,Boolean expand,StringBuilder internalSubsetBuilder,Int32& charCount,EntityType& entityType)    在System.Xml.XmlTextReaderImpl.ParseNumericCharRef(Boolean expand,StringBuilder internalSubsetBuilder,EntityType& entityType)    在System.Xml.XmlTextReaderImpl.HandleEntityReference(Boolean isInAttributeValue,EntityExpandType expandType,Int32& charRefEndPos)    在System.Xml.XmlTextReaderImpl.ParseAttributeValueSlow(Int32 curPos,Char quoteChar,NodeData attr)    在System.Xml.XmlTextReaderImpl.ParseAttributes()    在System.Xml.XmlTextReaderImpl.ParseElement()    在System.Xml.XmlTextReaderImpl.ParseDocumentContent()    在System.Xml.XmlTextReaderImpl.Read()    在System.Xml.Linq.XDocument.Load(XmlReader reader,LoadOptions选项)    在System.Xml.Linq.XDocument.Parse(String text,LoadOptions options)    在System.Xml.Linq.XDocument.Parse(String text)

  4. 似乎是“�”是一个无效字符,因此我们将值更改为有效字符,例如“`”然后两种方法都运作良好。

    有没有办法更改XDocument.Parse行为以忽略属性中的无效字符,如XmlDocument.LoadXml?

1 个答案:

答案 0 :(得分:2)

根据this arctice,值 实际上无效。我自己经历过XDocument类遵循比XmlDocument更严格的XML标准(我认为这是一件好事)。

阅读文章,他们会提出如何解决该错误的建议。