对于.NET框架3.5及以下,它可能已经可以使用XmlUrlResolver
,如图this answer。然而,这种方法在运行时从W3C网站下载DTD,这不是一个好主意,这不仅仅是因为W3C似乎正在阻止这样的请求。 other answer建议将DTD缓存为程序集中的嵌入资源,类似于HTML2XHTML。
对于使用.NET Framework 4.0及更高版本的其他读者,可以使用XmlPreloadedResolver
,建议by Daniel Renshaw,它支持XHTML 1.0。为了支持XHTML 1.1,您可以使用W3C网站上的xhtml11-flat.dtd的扁平化版本的DTD来简化您的实现。我定义的扩展方法用于此目的:
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);
谢谢,但XmlPreloadedResolver是.NET 4中仅:-(我在3.5。 – Polyfun 2010-09-17 08:47:02
你可以创建你自己的'XmlResolver'的派生类,它基本上是一样的。 – 2010-09-17 09:21:54
感谢这就是我所做的,使用这里的例子http://www.codeproject.com/KB/XML/HTML2XHTML.aspx?显示=打印。 – Polyfun 2010-09-17 09:35:05