¿Se permiten saltos de línea en los valores de atributos XML?

91

Me doy cuenta de que no es elegante ni deseado, pero ¿está permitido (en XML bien formado) que un valor de atributo en un elemento XML abarque varias líneas?

p.ej

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

Sí, me doy cuenta de que hay mejores formas de escribir eso. Yo personalmente lo escribiría así:

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

o:

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

Pero tenemos nuestro propio analizador XML y me gustaría saber si el primer ejemplo está permitido en XML bien formado.

CodeAndCats
fuente
1
El analizador .NET XDocument acepta esto como se esperaba, pero el valor del atributo se devuelve con un espacio, no con un avance de línea, como estaría en un texto <valor> como en el segundo ejemplo. (Su pregunta no es específica de .NET, pero mis datos de muestra lo son. No sé si esto es parte del estándar general o una característica de .NET).
Mark Hurd
1
Véase también stackoverflow.com/q/2004386/55452
David J. Liszewski
hizo un ejemplo de una pregunta similar que conserva nuevas líneas: stackoverflow.com/a/29782321/611007
n611x007

Respuestas:

101

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

Parece decir todo excepto <, &y su delimitador ( 'o ") está bien. Así que la nueva línea también debería serlo.

derobert
fuente
6
Un ejemplo cuando las nuevas líneas son una buena idea dentro de un atributo es para el atributo xsi: schemaLocation en la configuración de Spring, que puede contener varias URL separadas por espacios y, por lo tanto, ser mucho más largas que el ancho de la pantalla.
stivlo
3
es válido, sin embargo, el analizador los normalizará al espacio, como dice Jan Cetkovsky .
n611x007
Bueno ... utilizo varias líneas durante largas declaraciones de prueba if / when en documentos XSLT.
Nullius
51

Está permitido, sin embargo, de acuerdo con la recomendación del W3C, su analizador XML debe normalizar todos los caracteres de espacio en blanco al espacio (0x20), por lo que la salida de sus ejemplos será diferente (debe tener una nueva línea en la salida para "& # 13; & # 10 ; ", pero solo espacio en el primer caso).

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

Jan Cetkovsky
fuente
3

Solo .NET: si no está seguro de si la cadena de destino es un atributo xml válido (y proporciona el valor de este atributo a través del código), siempre puede usar la función SecurityElement.Escape para escapar de los caracteres no válidos.

Según la descripción de esta función, los únicos caracteres inválidos son:

<, >, &, ',"

Y esto significa (como escribieron mis predecesores), que la nueva línea debería estar bien.

Łukasz Wiatrak
fuente
2

Sí, el primer ejemplo es válido.

Reji
fuente