对于.NETFramework3.5及更低版本,可以使用
XmlUrlResolver
,如中所示
this answer
. 然而,这种方法在运行时从W3C网站下载dtd,这不是一个好主意,尤其是因为W3C似乎正在阻止这样的请求。这个
other answer
HTML2XHTML
.
对于其他使用.NETFramework4.0及更高版本的读者,您可以使用
XmlPreloadedResolver
,如建议
by Daniel Renshaw
,它支持XHTML1.0。为了支持XHTML1.1,您可以通过使用DTD的扁平化版本来简化实现
xhtml11-flat.dtd
在W3C网站上。我为此定义了一个扩展方法:
public static class XmlPreloadedResolverExtensions
{
private const string Xhtml11DtdPublicId = "-//W3C//DTD XHTML 1.1//EN";
private const string Xhtml11DtdSystemId = "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd";
public static void AddXhtml11(this XmlPreloadedResolver resolver, bool @override = false)
{
Add(resolver, new Uri(Xhtml11DtdPublicId, UriKind.RelativeOrAbsolute), ManifestResources.xhtml11_flat_dtd, @override);
Add(resolver, new Uri(Xhtml11DtdSystemId, UriKind.RelativeOrAbsolute), ManifestResources.xhtml11_flat_dtd, @override);
}
public static bool Add(this XmlPreloadedResolver resolver, Uri uri, Stream value, bool @override)
{
if (@override || !resolver.PreloadedUris.Contains(uri))
{
resolver.Add(uri, value);
return true;
}
return false;
}
}
这样就可以像平常一样使用了
XmlResolver
var xmlResolver = new XmlPreloadedResolver();
xmlResolver.AddXhtml11();
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.XmlResolver = xmlResolver;
XDocument document;
using (var xmlReader = XmlReader.Create(input, settings))
document = XDocument.Load(xmlReader);