2009-09-08 14 views
5

Tengo una aplicación donde necesito analizar XML y conservar el texto sin formato (por ejemplo, no analizar entidades, no convertir espacios en blanco en atributos, mantener el orden de los atributos , etc.) en un programa Java.parsing/scanning/tokenizing "raw XML"

He pasado varias horas tratando de usar StAX, SAX, XSLT, TagSoup, etc. antes de darme cuenta de que ninguno de ellos hace esto. No puedo darme el lujo de dedicar mucho más tiempo a atacar este problema, y ​​analizar el texto manualmente parece altamente no trivial. ¿Hay alguna biblioteca Java que pueda ayudarme a tokenizar el XML?

editar: ¿por qué estoy haciendo esto? - Tengo un gran archivo XML que quiero hacer un pequeño número de cambios localizados programáticamente, que necesitan ser revisados. Es muy valioso poder usar una herramienta diff. Si el analizador/analizador normaliza el XML, todo lo que veo es "tinta roja" en la herramienta diff. La aplicación que produce el XML en primer lugar no es algo que pueda haber cambiado fácilmente para producir "XML canónico", si existe tal cosa.

+1

¿Por qué necesita conservar el texto sin formato? – jmucchiello

+0

El texto sin formato puede tener nuevas líneas, etc., que quiera conservar. orden de atributo y similares podría ser importante para su uso. –

+0

De acuerdo con la especificación XML, los caracteres que no son de marcado, incluidos los espacios en blanco, como las líneas nuevas, se pasan a la aplicación: http://www.w3.org/TR/REC-xml/#sec-white-space –

Respuesta

2

Creo que es posible que tenga que generar su propia gramática.

Algunos enlaces:

+0

Creo que tienes razón, y es doloroso. No sé cómo usar ANTLR, y ni siquiera puedo encontrar un BNF legible por máquina para XML. El W3C tiene http://www.w3.org/TR/xml11/ pero el BNF está entremezclado con texto. > :( –

+0

Fue doloroso, pero hasta donde puedo decir, lo hice bien, y en el futuro puedo usar el código que escribí. –

+0

Me alegro de que funcionó para ti. Para cualquier otra persona que necesite extraer BNF de la especificación XML, se puede raspar desde la versión XML (actualmente en http://www.w3.org/TR/xml11/REC-xml11-20060816.xml). Buscar elementos – ykaganovich

2

no creo que cualquier analizador XML va a hacer lo que quiere. Por qué ? Por ejemplo, la especificación XML no impone el orden de los atributos. Creo que vas a tener que analizarlo tú mismo, y eso no es trivial.

¿Por qué tienes que hacer esto? Supongo que tiene algún cliente 'XML' que impone o depende de una construcción no estándar. En ese caso, retrocedería y lo solucionaría, en lugar de pasar por numerosas soluciones para intentar acomodar esto.

0

No estoy del todo seguro de que entiendo qué es lo que estás tratando de hacer. ¿Ha intentado usar regiones CDATA para las partes del documento que no desea que el analizador toque?

También confiar en el orden de los atributos es no una buena idea: si recuerdo el estándar XML correctamente, entonces el orden nunca se debe esperar.

Parece que está tratando con XML mal formado y que sería más fácil convertirlo primero en XML correcto.