As quebras de linha nos valores de atributos XML são permitidas?

91

Percebo que não é elegante ou desejado, mas é permitido (em XML bem formado) que um valor de atributo em um elemento XML se estenda por várias linhas?

por exemplo

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

Sim, eu sei que há maneiras melhores de escrever isso. Eu pessoalmente escreveria assim:

<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;" />

Mas nós temos nosso próprio analisador XML e gostaria de saber se o primeiro exemplo é permitido em XML bem formado.

CodeAndCats
fonte
1
O analisador .NET XDocument aceita isso conforme o esperado, mas o valor do atributo é retornado com um espaço, não uma alimentação de linha como seria em um texto <valor> como seu segundo exemplo. (Sua pergunta não é específica do .NET, mas meus dados de amostra são. Não sei se isso faz parte do padrão geral ou um recurso .NET.)
Mark Hurd
1
Consulte também stackoverflow.com/q/2004386/55452
David J. Liszewski
fez um exemplo para uma pergunta semelhante que preserva novas linhas: stackoverflow.com/a/29782321/611007
n611x007

Respostas:

101

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

Parece dizer tudo <, exceto , &e seu delimitador ( 'ou ") está OK. Portanto, nova linha também deve ser.

Derobert
fonte
6
Um exemplo de quando novas linhas são uma boa ideia dentro de um atributo é para o atributo xsi: schemaLocation na configuração do Spring, que pode conter vários URLs separados por espaços e, portanto, ser muito maior do que a largura da tela.
stivlo
3
é válido, entretanto, o analisador irá normalizá-los para o espaço, como diz Jan Cetkovsky .
n611x007,
Bem ... eu uso várias linhas para declarações de teste if / when longas em documentos XSLT.
Nullius
51

É permitido, no entanto, de acordo com a recomendação do W3C, seu analisador XML deve normalizar todos os caracteres de espaço em branco para espaço (0x20) - então a saída de seus exemplos será diferente (você deve ter uma nova linha na saída para "& # 13; & # 10 ; ", mas apenas espaço no primeiro caso).

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

Jan Cetkovsky
fonte
3

Somente .NET: Se você não tiver certeza se a string de destino é um atributo xml válido (e fornecer o valor desse atributo por meio do código), você sempre pode usar a função SecurityElement.Escape para escapar de caracteres inválidos.

De acordo com a descrição desta função, os únicos caracteres inválidos são:

<, >, &, ',"

E isso significa (como escreveram meus predecessores), essa nova linha deve estar OK.

Łukasz Wiatrak
fonte
2

Sim, o primeiro exemplo é válido.

Reji
fonte