我在处理几乎格式良好的 XHTML 文档的数据时遇到了问题,除了它在开头有多个 DTD 声明:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
...
</head>
<body>
...
</body>
</html>
我需要仅使用第一个DTD 将这些数据加载到 XDocument 对象中并忽略其余声明。不可能完全忽略 DTD 处理,因为文档可能包含不寻常的字符,例如â
or€
等。
文本是从外部来源检索的,我不知道为什么会这样。
显然,我加载此文档的天真尝试失败了System.Xml.XmlException : Cannot have multiple DTDs
:
var xmlReaderSettings = new XmlReaderSettings
{
DtdProcessing = DtdProcessing.Parse,
XmlResolver = new XmlPreloadedResolver(),
ConformanceLevel = ConformanceLevel.Document,
};
using (var xmlReader = XmlReader.Create(stream, xmlReaderSettings))
{
return XDocument.Load(xmlReader);
}
处理此类数据的最佳方法是什么?
PS:我忘了提,数据来自一个Stream
可能会或可能不会使字符串操作更复杂的数据