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

C# XmlReader: preserve nbsp entity when parsing XHTML

提问人:Andrei Hryhoryeu 提问时间:10/6/2016 更新时间:10/6/2016 访问量:437

问:

我需要解析一个(几乎)任意的XML字符串,该字符串是从XHTML获取的。例如。为了解决XHTML实体的问题,我按以下方式进行配置:<root>test default values &amp;&nbsp;&lt;&gt;</root>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);
            }
        }
    }

它工作得很好,除了一个问题:出于某种原因,当从字符串读取时,它确实将实体转换为实际的空格。因此,我得到了一个包含在 InnerXml 属性中的属性。如果可能的话,我真的需要保留实体。有什么办法可以做到吗?&nbsp;XmlNodetest default values &amp; &lt;&gt;

提前致谢。

PS 我认为这可能不是从字符串获取的最佳方式,但这不是我的代码,我将不胜感激任何建议。XmlNode

C# XML XHTML XML阅读器

评论

0赞 Alohci 10/8/2016
您确定这不仅仅是 InnerXml 的行为,它只是不将 U+00A0 字符序列化为实体引用,而是(因为它必须保持 XML 的完整性)将 、 和字符序列化为命名实体引用?即您的反序列化是否正确,并且您只需要以不同的方式将 DOM 文档序列化回 XML?&<>
0赞 Andrei Hryhoryeu 10/11/2016
@Alohci好吧,不,我不确定这不是无法更改的 InnerXml 的标准行为。可能是,但我想知道是否可以配置它。生成 HTML,在 JS 中转换为 XML 是所见即所得的编辑器 Redactor 的责任。它会自动放入 nbsp 实体,以防它是尾随空格(例如)。因此,我无法更改生成标记的方式,只能更改其反序列化。你有没有想过如何从字符串中反序列化XML,记住我不仅有纯XML实体,还有XHTML实体?谢谢

答: 暂无答案