C#XmlReader:在解析XHTML时保留实体

时间:2016-10-06 09:27:43

标签: c# xml xhtml xmlreader

我需要解析一个(几乎)任意的XML字符串,它是从XHTML获得的。例如,<root>test default values &amp;&nbsp;&lt;&gt;</root>。要解决XHTML实体的问题,我按以下方式配置XmlReader

    private XmlParserContext GetXhtmlParserContext()
    {
        var nameTable = new NameTable();
        var namespaceManager = new XmlNamespaceManager(nameTable);
        var context = new XmlParserContext(nameTable, namespaceManager, null, XmlSpace.Preserve)
        {
            DocTypeName = XhtmlDocTypeName,
            PublicId = XhtmlPublicId,
            SystemId = XhtmlSystemId
        };

        return context;
    }

    private XmlReaderSettings GetXhtmlReaderSettings()
    {
        return new XmlReaderSettings
        {
            DtdProcessing = DtdProcessing.Parse,
            ValidationType = ValidationType.DTD,
            XmlResolver = new XmlPreloadedResolver(XmlKnownDtds.All)
        };
    }

然后我按照以下方式使用它:

    public XmlNode DeserializeXhtml(string xhtmlContent)
    {
        var xmlSerializer = new XmlSerializer(typeof(XmlNode));
        XmlParserContext context = GetXhtmlParserContext();
        XmlReaderSettings settings = GetXhtmlReaderSettings();
        using (var stringReader = new StringReader(xhtmlContent))
        {
            using (var xmlReader = XmlReader.Create(stringReader, settings, context))
            {
                return (XmlNode)xmlSerializer.Deserialize(xmlReader);
            }
        }
    }

除了一个问题外,它完全正常:由于某种原因,它在从字符串读取时确实将&nbsp;实体转换为实际的空格。所以,我得到一个XmlNode,其中包含InnerXml属性中的test default values &amp; &lt;&gt;。如果可能的话,我真的需要保留实体。有没有办法做到这一点?

提前致谢。

P.S。我认为这可能不是从字符串中获取XmlNode的最佳方式,但它不是我的代码,我会感谢任何建议。

0 个答案:

没有答案