Разрешены ли разрывы строк в значениях атрибутов XML?

92

Я понимаю, что это не изящно и нежелательно, но разрешено ли (в правильно сформированном XML), чтобы значение атрибута в элементе XML занимало несколько строк?

например

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

Да, я понимаю, что есть способы написать это лучше. Я бы лично написал это так:

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

или:

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

Но у нас есть собственный анализатор XML, и я хотел бы знать, разрешен ли первый пример в правильно сформированном XML.

CodeAndCats
источник
1
Парсер .NET XDocument принимает это, как ожидалось, но значение атрибута возвращается с пробелом, а не с переводом строки, как это было бы в текстовом <value>, как во втором примере. (Ваш вопрос не относится к .NET, но мои примерные данные относятся к нему. Я не знаю, является ли это частью общего стандарта или функцией .NET.)
Марк Херд
1
См. Также stackoverflow.com/q/2004386/55452
Дэвид Дж. Лишевски,
сделал пример аналогичного вопроса, который сохраняет символы новой строки: stackoverflow.com/a/29782321/611007
n611x007
связанные: stackoverflow.com/questions/260436 - связанные: stackoverflow.com/questions/2004386 - связанные: stackoverflow.com/questions/1289524
n611x007

Ответы:

102

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

Кажется, говорит все, кроме <, &и ваш разделитель ( 'или ") в порядке. Так должна быть и новая строка.

Derobert
источник
6
Одним из примеров, когда новые строки являются хорошей идеей внутри атрибута, является атрибут xsi: schemaLocation в конфигурации Spring, который может содержать несколько URL-адресов, разделенных пробелами, и, следовательно, быть намного длиннее, чем ширина экрана.
stivlo
3
это верно, однако, как говорит Ян Цетковский, синтаксический анализатор нормализует их по пространству .
n611x007
Что ж ... Я использую несколько строк для длинных тестовых операторов if / when в документах XSLT.
Нуллий
51

Это разрешено, однако в соответствии с рекомендацией W3C ваш XML-анализатор должен нормализовать все пробельные символы до пробела (0x20), поэтому вывод ваших примеров будет отличаться (у вас должна быть новая строка на выходе для "& # 13; & # 10 ; ", но только пробел в первом случае).

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

Ян Цетковский
источник
3

Только .NET: если вы не уверены, является ли целевая строка допустимым атрибутом xml (и укажите значение этого атрибута с помощью кода), вы всегда можете использовать SecurityElement.Escape функцию чтобы избежать недопустимых символов.

Согласно описанию этой функции единственными недопустимыми символами являются:

<, >, &, ',"

А это означает (как писали мои предшественники), что новая строка должна быть в порядке.

Лукаш Виатрак
источник