2012-03-18 13 views
7

Quiero escribir un método para una clase de Java. El método acepta como entrada una cadena de datos XML como se indica a continuación.Cadena de reemplazar en la subcadena

<?xml version="1.0" encoding="UTF-8"?> 
<library> 

    <book> 
     <name> <> Programming in ANSI C <> </name> 
     <author> <> Balaguruswamy <> </author> 
     <comment> <> This comment may contain xml entities such as &, <and>. <> </comment> 
    </book> 

    <book> 
     <name> <> A Mathematical Theory of Communication <> </name> 
     <author> <> Claude E. Shannon <> </author> 
     <comment> <> This comment also may contain xml entities. <> </comment> 
    </book> 

    <!-- This library contains more than ten thousand books. --> 
</library> 

La cadena XML contiene una gran cantidad de partida subcadena y terminando con <>. La subcadena puede contener entidades XML como >, <, &, ' y " El método necesario reemplazarlos con & gt;., & lt;, & amp ;. apos; y & respectivamente

¿Hay algún método de expresión regular en Java para realizar esta tarea?

+0

¿Está pidiendo que se escape todo el XML, o solo el <> que sucede entre las etiquetas? –

+0

No todo el XML, pero en el medio. –

+1

¿Quién está generando el XML? Parecería que la forma correcta de solucionar el problema sería emitir xml válido en lugar de manipular los contenidos. – pimaster

Respuesta

3

¿Se le están transfiriendo estos datos, o puede controlarlos? Si es así, entonces sugeriría usar un bloque CDATA. Si no está seguro de los datos que se introducen en los bloques xml, simplemente envuelva todo en un CDATA antes de guardarlo en el DB

Si no tiene control sobre esto, entonces hasta donde yo sé, esto tomará una buena cantidad de codificación debido a la cantidad de casos extremos con los que posiblemente tendrá que lidiar. No es algo que una simple expresión regular podrá manejar (si un bloque válido está comenzando, si uno está finalizando, si uno ya ha finalizado, etc.)

Aquí hay una expresión regular muy básica para el caso <>, pero el resto realmente creo que acaba de obtener extremadamente complicado

\<\>* //For <> changes 
+0

¡Guau! Creo que es una idea nueva para mí. Esto no es lo que trato de seguir. Creo que funcionará para mí. Debo reemplazar todo el "<>" antes de la subcadena con "" después de la subcadena "]]>", ¿verdad? –

+0

Perdón por la eliminación anterior, me estaba distrayendo y malinterpreté un comentario suyo, así que pensé que volvería a escribir mi respuesta de manera diferente más adelante. Lo he actualizado y daré algunas expresiones regulares válidas en breve :) Pero, si puede guardar los datos con bloques CDATA, eso le hará la vida más fácil: D –

+0

+1 para recomendar CDATA, parece ser el enfoque correcto. – anubhava

2

que puede seguir en an example

  1. leer un archivo XML por Dom o SAX
  2. cadena de reemplazo por la expresión regular
  3. Escriba un archivo XML por Dom o SAX
+0

Dado que la subcadena contiene entidades XML, la lectura de Dom fallará, ¿verdad? –

+0

No estoy seguro; por favor pruébalo y hazme saber el resultado. Gracias – punny

Cuestiones relacionadas