Đối với .NET Framework 3.5 và dưới đây, nó có thể thực hiện được nếu sử dụng XmlUrlResolver
, như thể hiện trong this answer. Tuy nhiên, cách tiếp cận này tải xuống các DTD từ trang web W3C trong thời gian chạy, đó không phải là một ý tưởng hay, ít nhất là vì W3C dường như hiện đang chặn các yêu cầu đó. Các other answer đề nghị bộ nhớ đệm các DTD như tài nguyên nhúng trong lắp ráp, tương tự như HTML2XHTML của bạn.
Đối với những người đọc khác sử dụng .NET Framework 4.0 trở lên, bạn có thể sử dụng XmlPreloadedResolver
, như được đề xuất by Daniel Renshaw, hỗ trợ XHTML 1.0. Để hỗ trợ XHTML 1.1, bạn có thể đơn giản hóa việc triển khai của mình bằng cách sử dụng phiên bản DTD dẹt, có sẵn tại xhtml11-flat.dtd trên trang web W3C. Tôi xác định một phương pháp khuyến nông cho mục đích này:
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;
}
}
này sau đó có thể được sử dụng như bình thường XmlResolver
trường hợp:
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);
Cảm ơn, nhưng XmlPreloadedResolver là Net 4 chỉ :-(Tôi đang trên 3.5. – Polyfun
Bạn có thể tạo ra nguồn gốc của riêng bạn về 'XmlResolver' mà về cơ bản là giống nhau. –
cảm ơn đây là những gì tôi đã làm, sử dụng ví dụ ở đây http://www.codeproject.com/KB/XML/HTML2XHTML.aspx? display = In. – Polyfun