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

发布于 2024-09-25 12:30:36 字数 1936 浏览 1 评论 0 原文

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

  1. XML 字符串:

    string xml = @"";

  2. XmlDocument.LoadXml 代码和结果:

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

    结果:

    <字符符号=“&#x0;” />

  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,布尔展开,StringBuilder internalSubsetBuilder,Int32&charCount,EntityType&entityType) 在System.Xml.XmlTextReaderImpl.ParseNumericCharRef(布尔扩展,StringBuilder内部SubsetBuilder,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 阅读器,LoadOptions 选项) 在 System.Xml.Linq.XDocument.Parse(字符串文本,LoadOptions 选项) at System.Xml.Linq.XDocument.Parse(String text)

看来“&#x0;”是无效字符,因此我们将值更改为有效字符,例如“&#x60;”然后两种方法都效果很好。

有没有办法改变 XDocument.Parse 行为以忽略属性中的无效字符,就像 XmlDocument.LoadXml 那样?

Our project has been converted to use XDocument from XmlDocument few days ago, but we found a strange behavior while processing XML entity in attribute value with XDocument.Parse, the sample code as following:

  1. The XML string:

    string xml = @"<char symbol=""�"">";

  2. The XmlDocument.LoadXml code and result:

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

    Result:

    <char symbol="�" />

  3. The XDocument.Parse code and exception:

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

    Exception:

    A first chance exception of type 'System.Xml.XmlException' occurred in System.Xml.dll
    '.', hexadecimal value 0x00, is an invalid character. Line 1, position 18.
    at System.Xml.XmlTextReaderImpl.Throw(Exception e)
    at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
    at System.Xml.XmlTextReaderImpl.Throw(Int32 pos, String res, String[] args)
    at System.Xml.XmlTextReaderImpl.ParseNumericCharRefInline(Int32 startPos, Boolean expand, StringBuilder internalSubsetBuilder, Int32& charCount, EntityType& entityType)
    at System.Xml.XmlTextReaderImpl.ParseNumericCharRef(Boolean expand, StringBuilder internalSubsetBuilder, EntityType& entityType)
    at System.Xml.XmlTextReaderImpl.HandleEntityReference(Boolean isInAttributeValue, EntityExpandType expandType, Int32& charRefEndPos)
    at System.Xml.XmlTextReaderImpl.ParseAttributeValueSlow(Int32 curPos, Char quoteChar, NodeData attr)
    at System.Xml.XmlTextReaderImpl.ParseAttributes()
    at System.Xml.XmlTextReaderImpl.ParseElement()
    at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
    at System.Xml.XmlTextReaderImpl.Read()
    at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options)
    at System.Xml.Linq.XDocument.Parse(String text, LoadOptions options)
    at System.Xml.Linq.XDocument.Parse(String text)

It seems that the "�" is an invalid character, so we change the value to a valid character such as "`" then both methods worked well.

Is there any way to change the XDocument.Parse behavior to ignore the invalid character in attribute like XmlDocument.LoadXml does?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

盛夏已如深秋| 2024-10-02 12:30:36

根据 this arctice值 � 实际上是无效的。我亲身体验到 XDocument 类遵循比 XmlDocument 严格得多的 XML 标准(我认为这是一件好事)。

阅读这篇文章,他们给出了如何解决该错误的建议。

According to this arctice the value � is actually invalid. I've experienced myself that the XDocument class follows the XML standard much stricter than XmlDocument (which I think is a good thing).

Read the article, they give suggestions how to get around that error.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文