Les sauts de ligne dans les valeurs d'attribut XML sont-ils autorisés?


91

Je me rends compte que ce n'est ni élégant ni souhaité, mais est-il permis (en XML bien formé) pour une valeur d'attribut dans un élément XML de s'étendre sur plusieurs lignes?

par exemple

<some-xml-element value="this value goes over....
multiple lines!" />

Ouais, je me rends compte qu'il y a de meilleures façons d'écrire ça. Je l'écrirais personnellement comme:

<some-xml-element>
<value>this value goes over...
multiple lines!</value>
</some-xml-element>

ou:

<some-xml-element value="this value goes over....&#13;&#10;" />

Mais nous avons notre propre analyseur XML et j'aimerais savoir si le premier exemple est autorisé dans un XML bien formé.


1
L'analyseur .NET XDocument accepte cela comme prévu, mais la valeur de l'attribut est renvoyée avec un espace, pas un saut de ligne comme ce serait le cas dans un texte <valeur> comme votre deuxième exemple. (Votre question n'est pas spécifique à .NET, mais mes exemples de données le sont. Je ne sais pas si cela fait partie de la norme générale ou d'une fonctionnalité .NET.)
Mark Hurd


a fait un exemple d'une question similaire qui préserve les nouvelles lignes: stackoverflow.com/a/29782321/611007
n611x007

Réponses:


101

http://www.w3.org/TR/REC-xml/#NT-AttValue

Semble tout dire sauf <, &et votre délimiteur ( 'ou ") est OK. Donc, la nouvelle ligne devrait l'être aussi.


6
Un exemple où les nouvelles lignes sont une bonne idée à l'intérieur d'un attribut est pour l'attribut xsi: schemaLocation dans la configuration Spring, qui peut contenir plusieurs URL séparées par des espaces et donc être beaucoup plus longues que la largeur de l'écran.
stivlo

3
il est valide mais l'analyseur les normalisera dans l'espace, comme le dit Jan Cetkovsky .
n611x007

Eh bien ... j'utilise plusieurs lignes pour de longues instructions de test if / when dans les documents XSLT.
Nullius

51

Cela est autorisé, mais selon la recommandation du W3C, votre analyseur XML doit normaliser tous les caractères d'espacement en espace (0x20) - de sorte que la sortie de vos exemples sera différente (vous devriez avoir une nouvelle ligne sur la sortie pour "& # 13; & # 10 ; ", mais uniquement de l'espace dans le premier cas).

http://www.w3.org/TR/1998/REC-xml-19980210#AVNormalize


3

.NET uniquement: Si vous n'êtes pas sûr que la chaîne cible est un attribut XML valide (et que vous fournissez la valeur de cet attribut via le code), vous pouvez toujours utiliser la fonction SecurityElement.Escape pour échapper les caractères non valides.

Selon la description de cette fonction, les seuls caractères invalides sont:

<, >, &, ',"

Et cela signifie (comme mes prédécesseurs l'ont écrit), que la nouvelle ligne devrait être OK.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.