Question

Dans mon environnement, j'utilise Java pour sérialiser le jeu de résultats en XML.Cela se passe essentiellement comme ceci :

//foreach column of each row
xmlHandler.startElement(uri, lname, "column", attributes);
String chars = rs.getString(i);
xmlHandler.characters(chars.toCharArray(), 0, chars.length());
xmlHandler.endElement(uri, lname, "column");

Le XML ressemble à ceci dans Firefox :

<row num="69004">
    <column num="1">10069</column>
    <column num="2">sd&#26;</column>
    <column num="3">FCVolume                      </column>
</row>

Mais quand j'analyse le XML, j'obtiens le a

org.xml.sax.SAXParseException :Référence du personnage "&#26"est un caractère XML non valide.

Ma question est maintenant :Quels caractères dois-je remplacer ou comment dois-je encoder mes caractères pour qu'ils soient du XML valide ?

Était-ce utile?

La solution

J'ai trouvé une liste intéressante dans le Spécification XML:Selon cette liste, il est déconseillé d'utiliser le personnage n°26 (Hex : #x1A).

Les caractères définis dans les plages suivants sont également découragés.Ce sont soit des caractères de contrôle, soit des caractères Unicode non définis en permanence

Voir le gammes complètes.

Ce code remplace tous les Xml Utf8 non valides d'une chaîne :

public String stripNonValidXMLCharacters(String in) {
    StringBuffer out = new StringBuffer(); // Used to hold the output.
    char current; // Used to reference the current character.

    if (in == null || ("".equals(in))) return ""; // vacancy test.
    for (int i = 0; i < in.length(); i++) {
        current = in.charAt(i);
        if ((current == 0x9) ||
            (current == 0xA) ||
            (current == 0xD) ||
            ((current >= 0x20) && (current <= 0xD7FF)) ||
            ((current >= 0xE000) && (current <= 0xFFFD)) ||
            ((current >= 0x10000) && (current <= 0x10FFFF)))
            out.append(current);
    }
    return out.toString();
}    

c'est tiré de Caractères XML invalides :quand UTF8 valide ne signifie pas XML valide

Mais avec ça, j'ai toujours eu le problème de compatibilité UTF-8 :

org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence

Après avoir lu XML - renvoie XML au format UTF-8 à partir d'un servlet Je viens d'essayer ce qui se passe si je définis le Contenttype comme ceci :

response.setContentType("text/xml;charset=utf-8");

Et ça a marché....

Autres conseils

Langage de balisage extensible (XML) 1.0 :

  

Le caractère et commercial (& amp;) et le   le crochet angulaire gauche (<) ne doit pas apparaître   dans leur forme littérale, sauf lorsque   utilisé comme délimiteurs de balisage, ou dans un   commentaire, une instruction de traitement, ou   une section CDATA. S'ils sont nécessaires   ailleurs, ils doivent être échappés en utilisant   soit des références de caractères numériques ou   les chaînes " & amp; " et " < "   respectivement. Le support à angle droit   (>) peut être représenté en utilisant le   chaîne " > " ;, et doit, pour   compatibilité, être échappé en utilisant soit   " > " ou une référence de personnage quand   il apparaît dans la chaîne "]] > " dans   contenu, quand cette chaîne n'est pas   marquant la fin d’une section CDATA.

Vous pouvez ignorer l'encodage si vous utilisez CDATA:

<column num="1"><![CDATA[10069]]></column>
<column num="2"><![CDATA[sd&]]></column>

Quelle version de JRE utilisez-vous? Le projet saxo dit:

  

J2SE 1.4 regroupe une ancienne version de   SAX2. Comment rendre SAX2 R2 ou ultérieur disponible?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top