2009-01-08 21 views
5

Tengo un documento de plantilla xml que necesito cargar en un XmlDocument. por ejemplo,XmlDocument y procesamiento de esquema lento

myXMLDocument.Load(myXMLFile); 

Sin embargo, esto es muy lento ya que se carga en el dtd. He intentado ambos "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 doy la vuelta de cargar el dtd estableciendo la resolución en nulo (por ejemplo), entonces obtengo errores como "Reference to undeclared entity 'nbsp'" si el documento los contiene.

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

Respuesta

2

Usted puede evitar el 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(); 
    } 
} 
+0

Esto no me parece una solución : si el XML contiene entidades definidas en la DTD referenciada, no podrá analizar – MiMo

0

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

+0

He quitado todos menos los requeridos, sin embargo, no acelerar significativamente hacia arriba .. :( – Sprintstar

-1

¿Ha intentado crear un dispositivo de resolución ficticio que devuelve nulo para cualquier ruta dtd y pasarlo 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"); 
+1

Traté simplemente esto, pero causó que xmlDocument.Load lanzara una excepción 'Referencia de objeto no establecida a una instancia de un objeto' ... :( – Sprintstar

0

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

  • * Descargar el Mod y archivos * .ENT referencia el DTD (la instancia XmlResolver le dirá los nombres de los URI, que han sido buscados)
  • Agregar estos archivos a su proyecto como archivos de recursos
  • definir una subclase de XmlResolver, cuya GetEntity() devuelve una corriente creada a partir del archivo de recursos locales
3

respuesta de ChrisW suena interesante, sin embargo he implementado una resolución de caché de esta link: http://msdn.microsoft.com/en-us/library/bb669135.aspx

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

+0

Gracias por publicar eso. – ChrisW

+0

+1, funcionó para mí – MiMo

Cuestiones relacionadas