C # XmlReader: сохранение сущности nbsp при синтаксическом анализе XHTML

#c# #xml #xhtml #xmlreader

#c# #xml #xhtml #xmlreader

Вопрос:

Мне нужно проанализировать (почти) произвольную строку XML, полученную из XHTML. Например, <root>test default values amp;amp;amp;nbsp;amp;<amp;></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);
            }
        }
    }
  

Это работает отлично, за исключением одной проблемы: по какой-то причине он преобразует amp;nbsp; сущность в фактический пробел при чтении из строки. Итак, я получаю XmlNode значение, которое содержится test default values amp;amp; amp;<amp;> в свойстве InnerXml. Мне действительно нужно сохранить сущность, если это вообще возможно. Есть ли какие-либо способы сделать это?

Заранее спасибо.

PS Я предполагаю, что это может быть не лучший способ получения XmlNode из строки, но это не мой код, и я буду признателен за любые предложения.

Комментарии:

1. Вы уверены, что это не просто поведение InnerXml, что он просто не сериализует символ U 00A0 в качестве ссылки на сущность, но (потому что это необходимо для сохранения целостности XML) сериализует символы amp; , < , и > как ссылки на именованные сущности? т.Е. Правильна ли ваша десериализацияи вам просто нужно сериализовать документ DOM обратно в XML по-другому?

2. @Alohci ну, нет, я не уверен, что это не стандартное поведение InnerXml, которое нельзя изменить. Это может быть, но мне было интересно, можно ли его настроить. За генерацию HTML, который преобразуется в XML в JS, отвечает редактор WYSIWYG, называемый Redactor. Он автоматически вставляет сущность nbsp, если это конечный пробел (например). Итак, я не могу изменить способ создания разметки, только ее десериализацию. Есть ли у вас какие-либо идеи, как десериализовать XML из строки, имея в виду, что у меня будут не только чистые сущности XML, но и сущности XHTML? Спасибо