Pregunta

Dado un documento XML como este:

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

Quería analizar el documento XML anterior y generar una copia del mismo con todas sus entidades ya resueltas. Entonces, dado el documento XMl anterior, el analizador debería generar:

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

Sé que podría implementar un org.xml.sax.EntityResolver para resolver entidades, pero lo que no sé es cómo generar correctamente una copia del documento XML con todo aún intacto (excepto sus entidades). Por everything , me refiero a los espacios en blanco, el dtd en la parte superior del documento, los comentarios y cualquier otra cosa, excepto las entidades que deberían haberse resuelto previamente. Si esto no es posible, sugiera una forma que, al menos, pueda preservar la mayoría de las cosas (por ejemplo, todos menos comentarios).

Tenga en cuenta también que estoy restringido a la API Java pura proporcionada por Sun, por lo que no se pueden utilizar bibliotecas de terceros aquí.

¡Muchas gracias!

EDITAR: El documento XML anterior es una versión mucho más simplificada de su documento original. El original involucra una resolución de entidad muy compleja usando EntityResolver cuya importancia he reducido enormemente en esta pregunta. Lo que realmente me interesa es cómo producir una copia exacta del documento XML con un analizador XML que use EntityResolver para resolver las entidades.

¿Fue útil?

Solución

Es casi seguro que no puede hacer esto usando ningún analizador XML del que haya oído hablar, y ciertamente los analizadores XML Sun no pueden hacerlo. Felizmente descartarán detalles que no tienen importancia en lo que respecta al significado del XML. Por ejemplo,

<title>Stack Overflow Madness</title>

y

<title >Stack Overflow Madness</title >

son indistinguibles desde la perspectiva de la sintaxis XML, y los analizadores Sun (correctamente) los tratan como idénticos.

Creo que sus opciones son hacer el reemplazo tratando el XML como texto (como sugiere @Wololo) o relajar sus requisitos.

Por cierto, probablemente pueda usar un XmlEntityResolver independientemente del analizador XML. O cree una clase que haga lo mismo. Esto puede significar que String.replace ... no es la respuesta, pero debería poder implementar un expansor ad-hoc que itera sobre los caracteres en un buffer de caracteres, expandiéndolos en un segundo .

Otros consejos

¿Es posible que lea la plantilla xml como una cadena? Y con la cuerda haz algo como

string s = "<title>&title;</title>";
s = s.replace("&title;", "Stack Overflow Madness");
SaveXml(s);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top