#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? Спасибо