對於.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