Très similaire à cette question , sauf pour Java.
Quelle est la méthode recommandée pour encoder des chaînes pour une sortie XML en Java. Les chaînes peuvent contenir des caractères tels que "&", "<", etc.
Très similaire à cette question , sauf pour Java.
Quelle est la méthode recommandée pour encoder des chaînes pour une sortie XML en Java. Les chaînes peuvent contenir des caractères tels que "&", "<", etc.
Très simplement: utilisez une bibliothèque XML. De cette façon, ce sera en fait correct au lieu d'exiger une connaissance détaillée des bits de la spécification XML.
Comme d'autres l'ont mentionné, l'utilisation d'une bibliothèque XML est le moyen le plus simple. Si vous voulez vous échapper, vous pouvez consulter
StringEscapeUtils
la bibliothèque Apache Commons Lang .la source
StringEscapeUtils.escapeXml(str)
partir decommons-lang
. Je l'utilise dans l'application App Engine - fonctionne comme un charme. Voici le Java Doc pour cette fonction:\t
,\n
et\r
.\t
,\n
ou\r
doit être échappé?Utilisez simplement.
Cela permettra à tous les caractères sauf la fin
Vous pouvez donc inclure des caractères qui seraient illégaux tels que & et>. Par exemple.
Cependant, les attributs devront être échappés car les blocs CDATA ne peuvent pas être utilisés pour eux.
la source
Cela a bien fonctionné pour moi pour fournir une version échappée d'une chaîne de texte:
la source
Essaye ça:
la source
t==null
.Cette question a huit ans et n'est toujours pas une réponse entièrement correcte! Non, vous ne devriez pas avoir à importer une API tierce entière pour effectuer cette tâche simple. Mauvais conseil.
La méthode suivante:
J'ai essayé d'optimiser le cas le plus courant, tout en veillant à ce que vous puissiez diriger / dev / random à travers cela et obtenir une chaîne valide en XML.
Edit: pour ceux qui continuent d'insister sur le fait qu'il est insensé d'écrire votre propre code pour cela alors qu'il existe de très bonnes API Java pour traiter XML, vous voudrez peut-être savoir que l'API StAX incluse avec Oracle Java 8 (je n'en ai pas testé d'autres ) ne parvient pas à encoder correctement le contenu CDATA: il n'échappe pas aux séquences]]> du contenu. Une bibliothèque tierce, même celle qui fait partie du noyau Java, n'est pas toujours la meilleure option.
la source
StringEscapeUtils.escapeXml()
n'échappe pas aux caractères de contrôle (<0x20). XML 1.1 autorise les caractères de contrôle; XML 1.0 ne le fait pas. Par exemple,XStream.toXML()
sérialisera volontiers les caractères de contrôle d'un objet Java en XML, ce qu'un analyseur XML 1.0 rejettera.Pour échapper aux caractères de contrôle avec Apache commons-lang, utilisez
la source
la source
replaceAll
appels est très inefficace, en particulier pour les grandes chaînes. Chaque appel entraîne la création d'un nouvel objet String, qui restera en place jusqu'à la récupération de la mémoire. En outre, chaque appel nécessite de boucler à nouveau la chaîne. Cela pourrait être consolidé en une seule boucle manuelle avec des comparaisons avec chaque caractère cible à chaque itération.Alors que l'idéalisme dit d'utiliser une bibliothèque XML, à mon humble avis, si vous avez une idée de base de XML, le bon sens et les performances indiquent le modèle jusqu'au bout. C'est sans doute plus lisible aussi. Bien que l'utilisation des routines d'échappement d'une bibliothèque soit probablement une bonne idée.
Considérez ceci: XML était destiné à être écrit par des humains.
Utilisez des bibliothèques pour générer du XML lorsque votre XML comme "objet" modélise mieux votre problème. Par exemple, si des modules enfichables participent au processus de construction de ce XML.
Edit: quant à la façon d'échapper réellement au XML dans les modèles, l'utilisation de CDATA ou
escapeXml(string)
de JSTL sont deux bonnes solutions,escapeXml(string)
peuvent être utilisées comme ceci:la source
Le comportement de StringEscapeUtils.escapeXml () est passé de Commons Lang 2.5 à 3.0. Il n'échappe plus aux caractères Unicode supérieurs à 0x7f.
C'est une bonne chose, l'ancienne méthode était d'être un peu trop désireux d'échapper aux entités qui pouvaient simplement être insérées dans un document utf8.
Les nouveaux escapers à inclure dans Google Guava 11.0 semblent également prometteurs: http://code.google.com/p/guava-libraries/issues/detail?id=799
la source
Pour ceux qui recherchent la solution la plus rapide à écrire: utilisez les méthodes d' apache commons-lang :
StringEscapeUtils.escapeXml10()
pour xml 1.0StringEscapeUtils.escapeXml11()
pour xml 1.1StringEscapeUtils.escapeXml()
est désormais obsolète, mais était couramment utilisé dans le passéN'oubliez pas d'inclure la dépendance:
la source
Remarque: votre question concerne l' échappement , pas l' encodage . L'échappement consiste à utiliser <, etc. pour permettre à l'analyseur de distinguer «ceci est une commande XML» et «ceci est du texte». L'encodage est ce que vous spécifiez dans l'en-tête XML (UTF-8, ISO-8859-1, etc.).
Tout d'abord, comme tout le monde l'a dit, utilisez une bibliothèque XML. XML semble simple mais l'encodage + les éléments d'échappement sont du vaudou sombre (que vous remarquerez dès que vous rencontrerez des trémas et du japonais et d'autres trucs bizarres comme des " chiffres pleine largeur " (& # FF11; vaut 1)). Garder XML lisible par l'homme est une tâche de Sisyphe.
Je suggère de ne jamais essayer d'être intelligent en matière d'encodage de texte et d'échappatoire en XML. Mais ne laissez pas cela vous empêcher d'essayer; rappelez-vous simplement quand il vous mord (et il le fera).
Cela dit, si vous n'utilisez que UTF-8, pour rendre les choses plus lisibles, vous pouvez envisager cette stratégie:
<![CDATA[ ... ]]>
J'utilise ceci dans un éditeur SQL et cela permet aux développeurs de couper et coller du SQL à partir d'un outil SQL tiers dans le XML sans se soucier de s'échapper. Cela fonctionne parce que le SQL ne peut pas contenir de trémas dans notre cas, donc je suis en sécurité.
la source
Bien que je sois d'accord avec Jon Skeet en principe, je n'ai parfois pas la possibilité d'utiliser une bibliothèque XML externe. Et je trouve étrange que les deux fonctions pour échapper / échapper à une valeur simple (attribut ou balise, pas de document complet) ne sont pas disponibles dans les bibliothèques XML standard incluses avec Java.
En conséquence et sur la base des différentes réponses que j'ai vues postées ici et ailleurs, voici la solution que j'ai fini par créer (rien ne fonctionnait comme un simple copier / coller):
Ce qui précède s'adapte à plusieurs choses différentes:
À un moment donné, j'écrirai l'inversion de cette fonction, toUnescaped (). Je n'ai tout simplement pas le temps de faire ça aujourd'hui. Quand je le ferai, je viendrai mettre à jour cette réponse avec le code. :)
la source
null
caractère. Pouvez-vous expliquer la définition des deux valeurs,UNICODE_LOW
etUNICODE_HIGH
? Veuillez relire leif
qui utilise ces deux valeurs. Remarqueznull
(\u0000
ce qui est(int)0
) ne tombe pas entre ces deux valeurs. Lisez comment il devient correctement «échappé», tout comme TOUS les caractères Unicode existant en dehors de la plageUNICODE_LOW
etUNICODE_HIGH
, en utilisant la&#
technique.Pour échapper aux caractères XML, le moyen le plus simple est d'utiliser le projet Apache Commons Lang, JAR téléchargeable sur: http://commons.apache.org/lang/
La classe est la suivante: org.apache.commons.lang3.StringEscapeUtils;
Il a une méthode nommée "escapeXml", qui renverra une chaîne d'échappement appropriée.
la source
Si vous recherchez une bibliothèque pour faire le travail, essayez:
Guava 26.0 documenté ici
return XmlEscapers.xmlContentEscaper().escape(text);
Apache Commons Text 1.4 documenté ici
StringEscapeUtils.escapeXml11(text)
la source
Voici une solution simple et idéale pour encoder des caractères accentués!
Les sorties
la source
Vous pouvez utiliser la bibliothèque ESAPI (Enterprise Security API) , qui fournit des méthodes telles que
encodeForXML
etencodeForXMLAttribute
. Jetez un œil à la documentation de l' interface Encoder ; il contient également des exemples de création d'une instance de DefaultEncoder .la source
Remplacez simplement
Et pour les autres personnages:
la source
Utilisez JAXP et oubliez la gestion du texte, cela se fera automatiquement pour vous.
la source
Essayez d'encoder le XML à l'aide du sérialiseur XML Apache
la source
Voici ce que j'ai trouvé après avoir cherché partout une solution:
Obtenez la bibliothèque Jsoup:
Ensuite:
J'espère que cela aide quelqu'un
la source