Muy similar a esta pregunta , excepto para Java.
¿Cuál es la forma recomendada de codificar cadenas para una salida XML en Java? Las cadenas pueden contener caracteres como "&", "<", etc.
Muy similar a esta pregunta , excepto para Java.
¿Cuál es la forma recomendada de codificar cadenas para una salida XML en Java? Las cadenas pueden contener caracteres como "&", "<", etc.
Muy simple: use una biblioteca XML. De esa manera, será realmente correcto en lugar de requerir un conocimiento detallado de los bits de la especificación XML.
Como han mencionado otros, usar una biblioteca XML es la forma más sencilla. Si desea escapar, puede buscar en
StringEscapeUtils
la biblioteca Apache Commons Lang .fuente
StringEscapeUtils.escapeXml(str)
desdecommons-lang
. Lo uso en la aplicación App Engine: funciona como un encanto. Aquí está el documento de Java para esta función:\t
,\n
y\r
.\t
, ¿\n
o\r
es necesario escapar?Solo usa.
Esto permitirá que cualquier personaje excepto el final
Por lo tanto, puede incluir caracteres que serían ilegales como & y>. Por ejemplo.
Sin embargo, los atributos deberán escaparse ya que los bloques CDATA no se pueden usar para ellos.
fuente
Esto me ha funcionado bien para proporcionar una versión de escape de una cadena de texto:
fuente
Prueba esto:
fuente
t==null
.¡Esta pregunta tiene ocho años y aún no es una respuesta completamente correcta! No, no debería tener que importar una API de terceros completa para realizar esta sencilla tarea. Mal consejo.
El siguiente método:
Intenté optimizar para el caso más común, sin dejar de asegurarme de que podría canalizar / dev / random a través de esto y obtener una cadena válida en XML.
Editar: para aquellos que continúan insistiendo en que es una tontería escribir su propio código para esto cuando hay API de Java perfectamente buenas para tratar con XML, es posible que desee saber que la API de StAX incluida con Oracle Java 8 (no he probado otras ) no codifica correctamente el contenido CDATA: no escapa]]> secuencias en el contenido. Una biblioteca de terceros, incluso una que sea parte del núcleo de Java, no siempre es la mejor opción.
fuente
StringEscapeUtils.escapeXml()
no escapa a los caracteres de control (<0x20). XML 1.1 permite caracteres de control; XML 1.0 no lo hace. Por ejemplo,XStream.toXML()
felizmente serializará los caracteres de control de un objeto Java en XML, que un analizador XML 1.0 rechazará.Para escapar de los caracteres de control con Apache commons-lang, use
fuente
fuente
replaceAll
llamadas es muy ineficaz, especialmente para cadenas grandes. Cada llamada da como resultado la creación de un nuevo objeto String, que permanecerá hasta que se recoja la basura. Además, cada llamada requiere volver a recorrer la cadena. Esto podría consolidarse en un solo bucle manual con comparaciones con cada carácter objetivo en cada iteración.Si bien el idealismo dice que use una biblioteca XML, en mi humilde opinión, si tiene una idea básica de XML, el sentido común y el rendimiento lo dicen todo el camino. Podría decirse que también es más legible. Aunque usar las rutinas de escape de una biblioteca probablemente sea una buena idea.
Considere esto: XML estaba destinado a ser escrito por humanos.
Utilice bibliotecas para generar XML cuando tenga su XML como un "objeto" que modele mejor su problema. Por ejemplo, si los módulos conectables participan en el proceso de construcción de este XML.
Editar: en cuanto a cómo escapar de XML en plantillas, el uso de CDATA o
escapeXml(string)
de JSTL son dos buenas soluciones,escapeXml(string)
se pueden usar así:fuente
El comportamiento de StringEscapeUtils.escapeXml () ha cambiado de Commons Lang 2.5 a 3.0. Ahora ya no escapa a los caracteres Unicode superiores a 0x7f.
Esto es algo bueno, el método antiguo era estar un poco ansioso por escapar de las entidades que podrían simplemente insertarse en un documento utf8.
Los nuevos escapers que se incluirán en Google Guava 11.0 también parecen prometedores: http://code.google.com/p/guava-libraries/issues/detail?id=799
fuente
Para aquellos que buscan la solución más rápida de escribir: use métodos de apache commons-lang :
StringEscapeUtils.escapeXml10()
para xml 1.0StringEscapeUtils.escapeXml11()
para xml 1.1StringEscapeUtils.escapeXml()
ahora está en desuso, pero se usaba comúnmente en el pasadoRecuerde incluir la dependencia:
fuente
Nota: Su pregunta es sobre escapar , no codificar . Escapar es usar <, etc. para permitir que el analizador distinga entre "esto es un comando XML" y "esto es un texto". La codificación es lo que especifica en el encabezado XML (UTF-8, ISO-8859-1, etc.).
En primer lugar, como todos los demás dijeron, use una biblioteca XML. XML parece simple pero la codificación + el material de escape es un vudú oscuro (que notarás tan pronto como encuentres diéresis y japonés y otras cosas raras como " dígitos de ancho completo " (& # FF11; es 1)). Mantener XML legible por humanos es una tarea de Sisyphus.
Sugiero que nunca intentes ser inteligente sobre la codificación de texto y el escape en XML. Pero no dejes que eso te impida intentarlo; solo recuerda cuando te muerda (y lo hará).
Dicho esto, si usa solo UTF-8, para hacer las cosas más legibles, puede considerar esta estrategia:
<![CDATA[ ... ]]>
Estoy usando esto en un editor de SQL y permite a los desarrolladores cortar y pegar SQL desde una herramienta SQL de terceros en el XML sin preocuparse por escapar. Esto funciona porque el SQL no puede contener diéresis en nuestro caso, así que estoy a salvo.
fuente
Si bien estoy de acuerdo con Jon Skeet en principio, a veces no tengo la opción de usar una biblioteca XML externa. Y me parece peculiar que las dos funciones para escapar / no escapar de un valor simple (atributo o etiqueta, no documento completo) no están disponibles en las bibliotecas XML estándar incluidas con Java.
Como resultado y en base a las diferentes respuestas que he visto publicadas aquí y en otros lugares, aquí está la solución que terminé creando (nada funcionó como una simple copia / pegado):
Lo anterior se adapta a varias cosas diferentes:
En algún momento, escribiré la inversión de esta función, toUnescaped (). Simplemente no tengo tiempo para hacer eso hoy. Cuando lo haga, actualizaré esta respuesta con el código. :)
fuente
null
carácter. ¿Puede explicar la definición de los dos valoresUNICODE_LOW
yUNICODE_HIGH
? Vuelva a leer elif
que usa esos dos valores. Observenull
(\u0000
cuál es(int)0
) no cae entre estos dos valores. Lea cómo se "escapa" correctamente al igual que TODOS los caracteres Unicode que existen fuera del rangoUNICODE_LOW
yUNICODE_HIGH
, utilizando la&#
técnica.Para escapar de los caracteres XML, la forma más sencilla es utilizar el proyecto Apache Commons Lang, JAR descargable desde: http://commons.apache.org/lang/
La clase es esta: org.apache.commons.lang3.StringEscapeUtils;
Tiene un método llamado "escapeXml", que devolverá un String con el escape apropiado.
fuente
Si está buscando una biblioteca para hacer el trabajo, intente:
Guava 26.0 documentado aquí
return XmlEscapers.xmlContentEscaper().escape(text);
Apache Commons Text 1.4 documentado aquí
StringEscapeUtils.escapeXml11(text)
fuente
Esta es una solución fácil y también es ideal para codificar caracteres acentuados.
Salidas
fuente
Puede utilizar la biblioteca Enterprise Security API (ESAPI) , que proporciona métodos como
encodeForXML
yencodeForXMLAttribute
. Eche un vistazo a la documentación de la interfaz del codificador ; también contiene ejemplos de cómo crear una instancia de DefaultEncoder .fuente
Solo reemplaza
Y para otros personajes:
fuente
Use JAXP y olvídese del manejo de texto, se hará automáticamente.
fuente
Intente codificar el XML usando el serializador Apache XML
fuente
Esto es lo que encontré después de buscar en todas partes buscando una solución:
Obtenga la biblioteca Jsoup:
Luego:
Espero que esto ayude a alguien
fuente