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é.

CodeAndCats
la source
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
1
Voir aussi stackoverflow.com/q/2004386/55452
David J.Liszewski
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.

derobert
la source
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

Jan Cetkovsky
la source
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.

Łukasz Wiatrak
la source
2

Oui, le premier exemple est valide.

Reji
la source