Question

J'ai un modèle de document XML à charger dans un document XmlDocument. par exemple

myXMLDocument.Load(myXMLFile);

Cependant, ceci est très lent car il se charge dans le dtd. J'ai essayé à la fois & http; // http: //www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" et une copie locale du fichier dtd. Les deux prennent plus ou moins le même temps. Si je règle le chargement du dtd en définissant le résolveur sur null (par exemple), des erreurs telles que "Référence à l'entité non déclarée 'nbsp' & <; code> sont alors générées, si le document les contient.

Je dois utiliser un document XmlDocument car je dois manipuler le DOM avant de produire le document. Comment puis-je résoudre ces problèmes?

Était-ce utile?

La solution

Vous pouvez éviter la DTD si vous renvoyez un flux de mémoire vide:

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

Autres conseils

La réponse de ChrisW semble intéressante, mais j’ai implémenté un résolveur de mise en cache à partir de ce lien: http://msdn.microsoft.com/en-us/library/bb669135.aspx

Cela a augmenté la vitesse d'environ 11,5 secondes à 160 ms, ce qui est probablement suffisant pour le moment. Si ce n'est toujours pas assez rapide, je vais implémenter la solution de ChrisW. :)

Regardez le fichier DTD, il y a plus de références en ligne aux fichiers .mod, peut-être que cela ralentit le processus. Vous pouvez également essayer de commenter certaines d’entre elles, certaines d’entre elles, mais toutes ne sont pas marquées comme "obligatoires". dans les commentaires.

C'est lent car il est téléchargé depuis le réseau. Pour résoudre ce problème, procédez comme suit:

  • Téléchargez les fichiers * .mod et * .ent référencés par la DTD (votre instance XmlResolver vous indiquera les noms des adresses URI recherchées)
  • Ajoutez ces fichiers à votre projet en tant que fichiers de ressources
  • Définit une sous-classe de XmlResolver, dont la méthode GetEntity () renvoie un flux créé à partir du fichier de ressources local

Avez-vous essayé de créer un résolveur factice qui renvoie la valeur null pour n’importe quel chemin dtd et le transmet à la commande load? Quelque chose comme:

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");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top