106 votes

Le meilleur moyen de coder des données texte pour XML en Java?

Très similaire à cette question , sauf pour Java.

Quelle est la méthode recommandée pour coder des chaînes pour une sortie XML en Java? Les chaînes peuvent contenir des caractères tels que "&", "<", etc.

130voto

Fabian Steeg Points 24261

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 regarder dans StringEscapeUtils de la bibliothèque Apache Commons Lang .

37voto

Jon Skeet Points 692016

Très simplement: utilisez une bibliothèque XML. De cette façon, ce sera bien au lieu d’exiger une connaissance détaillée des bits de la spécification XML.

20voto

ng. Points 4096

Il suffit d'utiliser.

 <![CDATA[ your text here ]]>
 

Cela permettra à tous les caractères sauf la fin

 ]]>
 

Vous pouvez donc inclure des caractères illégaux tels que & et>. Par exemple.

 <element><![CDATA[ characters such as & and > are allowed ]]></element>
 

Cependant, les attributs devront être protégés car les blocs CDATA ne peuvent pas être utilisés pour eux.

14voto

Oleg K Points 161

Utilisez StringEscapeUtils.escapeXml(str) de commons-lang . Je l'utilise dans l'application App Engine - fonctionne à merveille.

Voici le Java Doc pour cette fonction:

13voto

Cela a bien fonctionné pour moi de fournir une version échappée d'une chaîne de texte:

 public class XMLHelper {

/**
 * Returns the string where all non-ascii and <, &, > are encoded as numeric entities. I.e. "&lt;A &amp; B &gt;"
 * .... (insert result here). The result is safe to include anywhere in a text field in an XML-string. If there was
 * no characters to protect, the original string is returned.
 * 
 * @param originalUnprotectedString
 *            original string which may contain characters either reserved in XML or with different representation
 *            in different encodings (like 8859-1 and UFT-8)
 * @return
 */
public static String protectSpecialCharacters(String originalUnprotectedString) {
    if (originalUnprotectedString == null) {
        return null;
    }
    boolean anyCharactersProtected = false;

    StringBuffer stringBuffer = new StringBuffer();
    for (int i = 0; i < originalUnprotectedString.length(); i++) {
        char ch = originalUnprotectedString.charAt(i);

        boolean controlCharacter = ch < 32;
        boolean unicodeButNotAscii = ch > 126;
        boolean characterWithSpecialMeaningInXML = ch == '<' || ch == '&' || ch == '>';

        if (characterWithSpecialMeaningInXML || unicodeButNotAscii || controlCharacter) {
            stringBuffer.append("&#" + (int) ch + ";");
            anyCharactersProtected = true;
        } else {
            stringBuffer.append(ch);
        }
    }
    if (anyCharactersProtected == false) {
        return originalUnprotectedString;
    }

    return stringBuffer.toString();
}

}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X