Pregunta

Tengo un documento de plantilla xml que necesito cargar en un XmlDocument. por ejemplo,

myXMLDocument.Load(myXMLFile);

Sin embargo, esto es muy lento ya que se carga en el dtd. He intentado con " http: //www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" y una copia local del dtd. Ambos toman más o menos el mismo tiempo. Si vuelvo a cargar el dtd configurando el resolutor en nulo (por ejemplo), recibo errores como " Referencia a la entidad no declarada 'nbsp' " si el documento contiene estos.

Necesito usar un XmlDocument ya que necesito manipular el DOM antes de enviar el documento. ¿Cómo puedo solucionar estos problemas?

¿Fue útil?

Solución

Puede evitar la DTD si devuelve una secuencia de memoria vacía:

private class DummyResolver : XmlResolver
{
   public override System.Net.ICredentials Credentials
   {
    set
    {
     // Do nothing.
    }
   }

public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
   {
    return new System.IO.MemoryStream();
   }
}

Otros consejos

La respuesta de ChrisW suena interesante, sin embargo implementé una resolución de caché desde este enlace: http://msdn.microsoft.com/en-us/library/bb669135.aspx

Eso aumentó la velocidad de alrededor de 11.5s a 160ms, lo que probablemente sea lo suficientemente bueno por ahora. Si aún no es lo suficientemente rápido, implementaré la solución de ChrisW. :)

Mire el archivo DTD, hay algunas referencias más en línea a los archivos .mod, tal vez estos retrasen el proceso. También puede intentar comentar algunos de ellos, algunos de ellos pero no todos están marcados como " requeridos " en los comentarios.

Es lento porque se está descargando de la red. Para solucionarlo, haga lo siguiente:

  • Descargue los archivos * .mod y * .ent a los que hace referencia la DTD (su instancia de XmlResolver le indicará los nombres de los URI que se están buscando)
  • Agregue estos archivos a su proyecto como archivos de recursos
  • Defina una subclase de XmlResolver, cuyo método GetEntity () devuelve una secuencia creada a partir del archivo de recursos local

¿Ha intentado crear una resolución ficticia que devuelva nulo para cualquier ruta dtd y pasarla al comando de carga? Algo como:

class DummyResolver : XmlUrlResolver 
{
    public override Uri ResolveUri (Uri baseUri, String relativeUri) 
    {
       return null;
    }
}

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.XmlResolver = new DummyResolver();

xmlDocument.Load(@"whatever.xml");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top