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.


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


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.


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


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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.