NET Framework 3.5 e sotto, sarebbe stato possibile utilizzare il XmlUrlResolver
, come mostrato in this answer. Tuttavia, questo approccio scarica i DTD dal sito Web W3C in fase di runtime, il che non è una buona idea, non ultimo perché W3C sembra attualmente bloccando tali richieste. Il other answer suggerisce di memorizzare nella cache i DTD come risorse incorporate nell'assieme, in modo simile al proprio HTML2XHTML.
Per altri lettori che utilizzano .NET Framework 4.0 e versioni successive, è possibile utilizzare XmlPreloadedResolver
, come suggerito by Daniel Renshaw, che supporta XHTML 1.0. Per supportare XHTML 1.1, è possibile semplificare l'implementazione utilizzando la versione appiattita della DTD, disponibile su xhtml11-flat.dtd sul sito Web W3C. Mi definisco un metodo di estensione per questo scopo:
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;
}
}
Questo potrebbe quindi essere utilizzato come normali XmlResolver
casi:
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);
Grazie, ma XmlPreloadedResolver è .Net 4 solo :-(Sono su 3,5. – Polyfun
Si potrebbe creare la propria derivazione di 'XmlResolver' che fondamentalmente fa la stessa cosa –
grazie a ciò che ho fatto, usando l'esempio qui http://www.codeproject.com/KB/XML/HTML2XHTML.aspx? Display = Stampa. – Polyfun