Domanda

Ho un documento modello xml che devo caricare in un documento Xml. ad esempio

myXMLDocument.Load(myXMLFile);

Tuttavia, questo è molto lento mentre si carica nel dtd. Ho provato sia " http: //www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" sia una copia locale del dtd. Entrambi richiedono più o meno lo stesso tempo. Se giro a caricare il dtd impostando il risolutore su null (ad esempio), ottengo errori come " Riferimento all'entità non dichiarata 'nbsp' " se il documento li contiene.

Devo usare un XmlDocument come ho bisogno di manipolare il DOM prima di emettere il documento. Come posso aggirare questi problemi?

È stato utile?

Soluzione

È possibile evitare il DTD se si restituisce un flusso di memoria vuoto:

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();
   }
}

Altri suggerimenti

La risposta di ChrisW sembra interessante, tuttavia ho implementato un risolutore di cache da questo link: http://msdn.microsoft.com/en-us/library/bb669135.aspx

Ciò ha aumentato la velocità da circa 11,5 secondi a 160 ms, il che è probabilmente abbastanza buono per ora. Se non è ancora abbastanza veloce, implorerò la soluzione di ChrisW. :)

Guarda il file DTD, ci sono altri riferimenti online ai file .mod, forse questi rallentano il processo. Puoi anche provare a commentarne alcuni, alcuni, ma non tutti sono contrassegnati come "richiesto". nei commenti.

È lento perché viene scaricato dalla rete. Per risolvere il problema, procedi come segue:

  • Scarica i file * .mod e * .ent a cui fa riferimento il DTD (la tua istanza XmlResolver ti dirà i nomi degli URI che stai cercando)
  • Aggiungi questi file al tuo progetto come file di risorse
  • Definire una sottoclasse di XmlResolver, il cui metodo GetEntity () restituisce un flusso creato dal file di risorse locale

Hai provato a creare un risolutore fittizio che restituisce null per qualsiasi percorso dtd e lo ha passato nel comando load? Qualcosa del tipo:

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");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top