5 votes

Caractères spéciaux dans les fichiers XML - traitement avec l'API DOM

J'ai un fichier au format XML (composé uniquement de balises de début et de fin de la racine, et des enfants de la racine). Les éléments de texte des enfants contiennent le symbole de l'esperluette &. En XML, ce symbole n'est pas autorisé pour que le document soit valide, et lorsque j'ai essayé de traiter le fichier en utilisant l'API DOM en Java et un analyseur XML, j'ai obtenu des erreurs d'analyse. J'ai donc remplacé le symbole & par & et j'ai traité le fichier avec succès : Je devais extraire les valeurs des éléments de texte dans différents fichiers de texte brut.

Quand j'ai ouvert ces fichiers textes nouvellement créés, je m'attendais à voir & mais il y avait & à la place. Comment cela se fait-il ? J'ai stocké le texte dans des fichiers texte sans aucune extension (mon fichier original au format XML n'avait pas non plus d'extension .xml), et je n'ai que & dans le texte du nouveau fichier, quelle que soit la façon dont j'ouvre le fichier : en tant que txt ou en tant que fichier xml (ce sont quelques-unes des options de mon éditeur XML). Que se passe-t-il exactement ? Est-ce que Java ( ?) convertit & à & automatiquement ? Ou existe-t-il un encodage par défaut ? Bien, & signifie &, et je suppose qu'il y a une conversion automatique "invisible", mais je ne sais pas quand et comment cela se produit. Voici des exemples de mon fichier original et du fichier extrait que je reçois après avoir traité le fichier original avec Java :

Voici mon fichier "negative.review" au format XML :

<review>
<review_text>
I will not wear it as it is too big &amp; looks funny on me. 
</review_text>
</review>

Voici mon fichier extrait "negative_1" :

I will not wear it as it is too big & looks funny on me. 

Pour moi, il est important d'avoir les données originales telles quelles (sans faire de conversions/remplacements), donc j'ai pensé que je devais traiter le fichier extrait "negative_1" en le convertissant en retour. &amp; à &. Comme vous le voyez, il semble que je n'aie pas à le faire. Mais je ne comprends pas pourquoi :(.

Merci d'avance !

11voto

Tomalak Points 150423

La raison en est simple : Le fichier XML contient réellement un "&" caractère.

Il est simplement représenté différemment (c'est-à-dire qu'il est "échappé"), parce qu'une véritable "&" sur ses propres fichiers XML de rupture, comme vous l'avez vu. Lisez la section correspondante dans la spécification XML 1.0 : "2.4 Données de caractères et balisage" . Il ne s'agit que de quelques lignes, mais elles expliquent assez bien le problème.

Le XML est une représentation de données ( !). Ne le considérez pas comme un fichier texte. Exemple :

Vous voulez stocker la chaîne de caractères "17 < 20" dans un fichier XML. Initialement, vous ne pouvez pas, car le "<" est réservé comme parenthèse ouvrante de la balise. Ce serait donc invalide :

<xml>17 < 20</xml>

Solution : Vous utilisez l'échappement de caractères sur le caractère spécial/réservé, juste pour conserver la validité du fichier :

<xml>17 &lt; 20</xml>

À toutes fins utiles, l'extrait ci-dessus contient les données suivantes (en représentation JSON cette fois) :

{
  "xml": "17 < 20"
}

C'est pourquoi vous voyez le vrai "&" dans votre post-traitement. Il avait été échappé de la même façon, mais c'est signification est resté le même tout le temps.

L'exemple ci-dessus explique également pourquoi le "&" doivent être traités de façon particulière : Il fait lui-même partie du mécanisme d'échappement XML. Il marque le début d'une séquence d'échappement, comme dans "&lt;" . Il doit donc s'échapper lui-même (avec "&amp;" comme vous l'avez fait).

2voto

Alex Martelli Points 330805

Tout analyseur XML traduira implicitement des entités telles que &amp; , &lt; , &gt; en caractères correspondants, dans le cadre du processus d'analyse du fichier.

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