2

我从事 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 时,它​​会显示“checkCharacters = True”。我究竟做错了什么?

4

1 回答 1

2

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

您使用的Create函数将使用备注部分中介绍的默认设置:

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

于 2013-09-11T16:49:55.140 回答