XmlDocument e elaborazione dello schema lento
-
05-07-2019 - |
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?
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");