Pour .NET Framework 3.5 et au-dessous, il aurait été possible d'utiliser le XmlUrlResolver
, comme le montre this answer. Cependant, cette approche télécharge les DTD du site Web du W3C au moment de l'exécution, ce qui n'est pas une bonne idée, d'autant plus que le W3C semble bloquer actuellement de telles demandes. Le other answer suggère de mettre en cache les DTD en tant que ressources incorporées dans l'assembly, similaire à votre HTML2XHTML.
Pour les autres lecteurs utilisant .NET Framework 4.0 et supérieur, vous pouvez utiliser XmlPreloadedResolver
, comme suggéré by Daniel Renshaw, qui prend en charge XHTML 1.0. Pour prendre en charge XHTML 1.1, vous pouvez simplifier votre implémentation en utilisant la version aplatie de la DTD, disponible au xhtml11-flat.dtd sur le site Web du W3C. Je définir une méthode d'extension à cet effet:
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;
}
}
Cela pourrait alors être utilisé comme cas XmlResolver
ordinaires:
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);
Merci, mais XmlPreloadedResolver est .Net 4 seulement :-(Je suis sur 3,5. – Polyfun
Vous pouvez créer votre propre dérivation de 'XmlResolver' qui fait fondamentalement la même chose: –
merci c'est ce que j'ai fait, en utilisant l'exemple ici http://www.codeproject.com/KB/XML/HTML2XHTML.aspx? display = Imprimer. – Polyfun