Чи дозволені розриви рядків у значеннях атрибутів XML?


91

Я розумію, що це не елегантно чи бажано, але чи дозволено (у добре сформованому 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.


1
Синтаксичний аналізатор .NET XDocument приймає це, як очікувалося, але значення атрибута повертається з пробілом, а не з подачею рядка, як це було б у тексті <значення>, як у другому прикладі. (Ваше запитання не стосується .NET, але мої зразки даних є. Я не знаю, чи є це частиною загального стандарту чи функцією .NET.)
Марк Херд,


навів приклад на аналогічне питання , який зберігає переведення рядків: stackoverflow.com/a/29782321/611007
n611x007

пов'язані з : stackoverflow.com/questions/260436 - пов'язані з : stackoverflow.com/questions/2004386 - пов'язані: stackoverflow.com/questions/1289524
n611x007

Відповіді:


101

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

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


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#AVНормалізувати


3

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

Згідно з описом цієї функції, єдиними недійсними символами є:

<, >, &, ',"

А це означає (як писали мої попередники), що новий рядок повинен бути в порядку.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.