Comment encoder des caractères d’Oracle vers XML ?
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</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 ""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 ?
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?