为什么 XmlReader 在设置显示相反时检查非法字符

本文关键字:检查 非法 字符 XmlReader 设置 显示 为什么 | 更新日期: 2023-09-27 18:31:07

我从事Unity3d项目的工作,该项目使用.NET平台的Mono实现。我在包含高低 unicode 代理项的 XML 上使用 XmlReader,例如:

<node data="&#55357;&#56845; ...
                    ^ Here's the symbol referenced in exception

XML 没有标记 — 这很糟糕,但无法更改以向后兼容。(出于同样的原因,整个 xml 几乎无法更改)。因此,我的理解是 XmlReader 假定 XML 版本 1.0,其中 unicode 代理项是非法字符。

但是,我不希望 XmlReader 检查字符的合法性,并使用 CheckCharacter 设置告诉他不要这样做。代码如下:

    public void Load(MemoryStream stream)
    {
        using (var reader = System.Xml.XmlReader.Create(stream))
        {
            reader.Settings.CheckCharacters = false;
            m_Document = XDocument.Load(reader); // Here goes exception
        }
    }

但是,我仍然收到此异常:

XmlException: Referenced character was not allowed in XML. Normalization is True, checkCharacters = True  Line 1, position 580.
Mono.Xml2.XmlTextReader.ReadCharacterReference ()
Mono.Xml2.XmlTextReader.ReadAttributeValueTokens (Int32 dummyQuoteChar)
Mono.Xml2.XmlTextReader.ReadAttributes (Boolean isXmlDecl)
Mono.Xml2.XmlTextReader.ReadStartTag ()
Mono.Xml2.XmlTextReader.ReadContent ()
Mono.Xml2.XmlTextReader.Read ()
System.Xml.XmlTextReader.Read ()
Mono.Xml.XmlFilterReader.Read ()
System.Xml.XmlReader.ReadEndElement ()
System.Xml.Linq.XElement.LoadCore (System.Xml.XmlReader r, LoadOptions options)
System.Xml.Linq.XNode.ReadFrom (System.Xml.XmlReader r, LoadOptions options)
System.Xml.Linq.XContainer.ReadContentFrom (System.Xml.XmlReader reader, LoadOptions options)
System.Xml.Linq.XElement.LoadCore (System.Xml.XmlReader r, LoadOptions options)
System.Xml.Linq.XNode.ReadFrom (System.Xml.XmlReader r, LoadOptions options)
System.Xml.Linq.XContainer.ReadContentFrom (System.Xml.XmlReader reader, LoadOptions options)
System.Xml.Linq.XElement.LoadCore (System.Xml.XmlReader r, LoadOptions options)
System.Xml.Linq.XNode.ReadFrom (System.Xml.XmlReader r, LoadOptions options)
System.Xml.Linq.XContainer.ReadContentFrom (System.Xml.XmlReader reader, LoadOptions options)
System.Xml.Linq.XElement.LoadCore (System.Xml.XmlReader r, LoadOptions options)
System.Xml.Linq.XNode.ReadFrom (System.Xml.XmlReader r, LoadOptions options)
System.Xml.Linq.XContainer.ReadContentFrom (System.Xml.XmlReader reader, LoadOptions options)
System.Xml.Linq.XDocument.ReadContent (System.Xml.XmlReader reader, LoadOptions options)
System.Xml.Linq.XDocument.LoadCore (System.Xml.XmlReader reader, LoadOptions options)
System.Xml.Linq.XDocument.Load (System.Xml.XmlReader reader, LoadOptions options)
System.Xml.Linq.XDocument.Load (System.Xml.XmlReader reader)
(My code that you can see above)

真正奇怪的是,当我将其设置为false时,它说"checkCharacter = True"。我做错了什么?

为什么 XmlReader 在设置显示相反时检查非法字符

如果要

自定义设置,则需要将设置传递给XmlReader.Create(Stream,XmlReaderSEttings)函数。

您使用的"

创建"函数将使用"备注"部分中介绍的默认设置:

具有默认设置的 XmlReaderSettings 对象用于创建读取器。如果要指定要在创建的读取器上支持的功能,请使用将 XmlReaderSettings 对象作为其参数之一的重载,并使用正确的设置传入 XmlReaderSettings 对象。