为什么XmlReader在设置告知时检查非法字符?

时间:2013-09-11 16:43:49

标签: c# xml unicode mono escaping

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

<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”。我做错了什么?

1 个答案:

答案 0 :(得分:2)

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

您使用的Create功能将使用备注部分中所述的默认设置:

  

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