我需要解析一个(几乎)任意的XML字符串,它是从XHTML获得的。例如,<root>test default values & <></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);
}
}
}
除了一个问题外,它完全正常:由于某种原因,它在从字符串读取时确实将
实体转换为实际的空格。所以,我得到一个XmlNode
,其中包含InnerXml属性中的test default values & <>
。如果可能的话,我真的需要保留实体。有没有办法做到这一点?
提前致谢。
P.S。我认为这可能不是从字符串中获取XmlNode
的最佳方式,但它不是我的代码,我会感谢任何建议。