Domanda

Dato un documento XML come questo:

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

Volevo analizzare il documento XML sopra e generarne una copia con tutte le sue entità già risolte. Quindi, dato il documento XMl sopra, il parser dovrebbe produrre:

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

So che potresti implementare un org.xml.sax.EntityResolver per risolvere entità, ma ciò che non so è come generare correttamente una copia del documento XML con tutto ancora intatto (tranne le sue entità). Con tutto intendo gli spazi bianchi, il dtd nella parte superiore del documento, i commenti e qualsiasi altra cosa tranne le entità che avrebbero dovuto essere risolte in precedenza. Se ciò non è possibile, suggerisci un modo in cui almeno in grado di preservare la maggior parte delle cose (ad esempio tutte, ma nessun commento).

Nota anche che sono limitato alla pura API Java fornita da Sun, quindi qui non è possibile utilizzare librerie di terze parti.

Grazie mille!

EDIT: il documento XML sopra è una versione molto semplificata del documento originale. Quello originale prevede una risoluzione di entità molto complessa usando EntityResolver il cui significato ho notevolmente ridotto in questa domanda. Quello che mi interessa davvero è come produrre una copia esatta del documento XML con un parser XML che utilizza EntityResolver per risolvere le entità.

È stato utile?

Soluzione

Quasi certamente non puoi farlo usando qualsiasi parser XML di cui ho sentito parlare, e certamente i parser Sun XML non possono farlo. Scarteranno felicemente dettagli che non hanno alcun significato per quanto riguarda il significato dell'XML. Ad esempio,

<title>Stack Overflow Madness</title>

e

<title >Stack Overflow Madness</title >

sono indistinguibili dal punto di vista della sintassi XML e i parser Sun (giustamente) li trattano come identici.

Penso che le tue scelte siano di fare la sostituzione trattando l'XML come testo (come suggerisce @Wololo) o rilassare le tue esigenze.

A proposito, probabilmente puoi usare un XmlEntityResolver indipendentemente dal parser XML. O crea una classe che fa la stessa cosa. Ciò può significare che String.replace ... non è la risposta, ma dovresti essere in grado di implementare un espansore ad hoc che scorre i caratteri in un buffer di caratteri, espandendoli in un secondo .

Altri suggerimenti

È possibile leggere nel modello xml come stringa? E con la stringa fai qualcosa di simile

string s = "<title>&title;</title>";
s = s.replace("&title;", "Stack Overflow Madness");
SaveXml(s);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top