Para .NET Framework 3.5 y por debajo, que podría haber sido posible utilizar el XmlUrlResolver
, como se muestra en this answer. Sin embargo, este enfoque descarga las DTD del sitio web del W3C en tiempo de ejecución, lo que no es una buena idea, sobre todo porque el W3C parece estar bloqueando actualmente dichas solicitudes. El other answer sugiere almacenar en caché los DTD como recursos incrustados en el ensamblado, similar a su HTML2XHTML.
Para otros lectores que usan .NET Framework 4.0 y superior, puede usar XmlPreloadedResolver
, como se sugiere by Daniel Renshaw, que es compatible con XHTML 1.0. Para admitir XHTML 1.1, puede simplificar su implementación utilizando la versión plana de la DTD, disponible en el xhtml11-flat.dtd en el sitio web de W3C. Defino un método de extensión para este propósito:
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;
}
}
Esto podría ser utilizado como ordinarios XmlResolver
casos:
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);
Gracias, pero es XmlPreloadedResolver .Net 4 solamente :-(Estoy en 3.5. – Polyfun
Podrías crear tu propia derivación de 'XmlResolver' que hace básicamente lo mismo. –
gracias esto es lo que he hecho, usando el ejemplo aquí http://www.codeproject.com/KB/XML/HTML2XHTML.aspx? pantalla = Imprimir. – Polyfun