Comment générer une copie * exacte * d'un document XML avec des entités résolues

StackOverflow https://stackoverflow.com/questions/1641944

  •  10-07-2019
  •  | 
  •  

Question

Étant donné un document XML comme celui-ci:

 <!DOCTYPE doc SYSTEM 'http://www.blabla.com/mydoc.dtd'>
 <author>john</author>
 <doc>
   <title>&title;</title>
 </doc>  

Je souhaitais analyser le document XML ci-dessus et en générer une copie avec toutes ses entités déjà résolues. Donc, étant donné le document XMl ci-dessus, l'analyseur doit générer:

 <!DOCTYPE doc SYSTEM 'http://www.blabla.com/mydoc.dtd'>
 <author>john</author>
 <doc>
   <title>Stack Overflow Madness</title>
 </doc>  

Je sais que vous pouvez implémenter un org.xml.sax.EntityResolver pour résoudre les entités, mais ce que je ne sais pas, c'est comment générer correctement une copie du document XML avec tout reste intact (à l'exception de ses entités). Par tout , j'entends les espaces, le dtd en haut du document, les commentaires et tout autre élément, à l'exception des entités qui auraient dû être résolues auparavant. Si cela n’est pas possible, veuillez suggérer un moyen qui permette au moins de préserver la plupart des éléments (par exemple, tous sauf les commentaires).

Notez également que je suis limité à l'API Java pure fournie par Sun. Par conséquent, aucune bibliothèque tierce ne peut être utilisée ici.

Merci beaucoup!

EDIT: le document XML ci-dessus est une version très simplifiée de son document original. L'original implique une résolution d'entité très complexe utilisant EntityResolver, dont l'importance a été considérablement réduite dans cette question. Ce qui m’intéresse vraiment, c’est de savoir comment produire une copie exacte du document XML avec un analyseur syntaxique XML qui utilise EntityResolver pour résoudre les entités.

Était-ce utile?

La solution

Vous ne pouvez certainement pas utiliser cela avec un analyseur XML dont j'ai entendu parler, et les analyseurs XML de Sun ne peuvent certainement pas le faire. Ils se débarrasseront volontiers des détails qui n'ont aucune signification en ce qui concerne la signification du XML. Par exemple,

<title>Stack Overflow Madness</title>

et

<title >Stack Overflow Madness</title >

ne peuvent pas être distingués du point de vue de la syntaxe XML, et les analyseurs syntaxiques Sun les traitent (à juste titre) comme identiques.

Je pense que vous avez le choix entre remplacer le traitement du XML par du texte (comme le suggère @Wololo) ou assouplir vos exigences.

Au fait, vous pouvez probablement utiliser un XmlEntityResolver indépendamment de l’analyseur XML. Ou créez une classe qui fait la même chose. Cela peut signifier que String.replace ... n'est pas la solution, mais vous devriez pouvoir implémenter un expandeur ad-hoc qui itère sur les caractères d'un tampon de caractères, en les développant dans un second. .

Autres conseils

Est-il possible pour vous de lire le modèle XML sous forme de chaîne? Et avec la chaîne faire quelque chose comme

string s = "<title>&title;</title>";
s = s.replace("&title;", "Stack Overflow Madness");
SaveXml(s);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top