Czy dozwolone są podziały wierszy w wartościach atrybutów XML?

92

Zdaję sobie sprawę, że nie jest to eleganckie ani pożądane, ale czy dozwolone jest (w dobrze sformułowanym XML), aby wartość atrybutu w elemencie XML obejmowała wiele wierszy?

na przykład

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

Tak, zdaję sobie sprawę, że są lepsze sposoby na napisanie tego. Osobiście napisałbym to tak:

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

lub:

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

Ale mamy własny parser XML i chciałbym wiedzieć, czy pierwszy przykład jest dozwolony w dobrze sformułowanym XML.

CodeAndCats
źródło
1
Parser .NET XDocument akceptuje to zgodnie z oczekiwaniami, ale wartość atrybutu jest zwracana ze spacją, a nie wysuwem wiersza, jak w tekście <wartość>, jak w drugim przykładzie. (Twoje pytanie nie jest specyficzne dla .NET, ale moje przykładowe dane są. Nie wiem, czy jest to część ogólnego standardu, czy funkcja .NET.)
Mark Hurd,
1
Zobacz także stackoverflow.com/q/2004386/55452
David J. Liszewski
podałem

Odpowiedzi:

102

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

Wydaje się, że mówi wszystko oprócz <, &i twój separator ( 'lub ") jest OK. Więc nowa linia też powinna być.

derobert
źródło
6
Jednym z przykładów, kiedy nowe wiersze są dobrym pomysłem wewnątrz atrybutu, jest atrybut xsi: schemaLocation w konfiguracji Spring, który może zawierać kilka adresów URL oddzielonych spacjami, a zatem być znacznie dłuższy niż szerokość ekranu.
Stivlo
3
jest to poprawne, ale parser znormalizuje je do przestrzeni, jak mówi Jan Cetkovsky .
n611x007
Cóż ... Używam wielu wierszy dla długich instrukcji if / when w dokumentach XSLT.
Nullius
51

Jest to dozwolone, jednak zgodnie z zaleceniem W3C twój parser XML powinien znormalizować wszystkie białe znaki do spacji (0x20) - więc wyjście twoich przykładów będzie się różnić (powinieneś mieć nowy wiersz na wyjściu dla "& # 13; & # 10 ; ”, ale tylko spacja w pierwszym przypadku).

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

Jan Cetkovsky
źródło
3

Tylko .NET: jeśli nie masz pewności, czy ciąg docelowy jest prawidłowym atrybutem xml (i podaj wartość tego atrybutu za pośrednictwem kodu), zawsze możesz użyć funkcji SecurityElement.Escape, aby uniknąć nieprawidłowych znaków.

Zgodnie z opisem tej funkcji jedynymi nieprawidłowymi znakami są:

<, >, &, ',"

A to oznacza (jak pisali moi poprzednicy), że nowa linia powinna być OK.

Łukasz Wiatrak
źródło
2

Tak, pierwszy przykład jest prawidłowy.

Reji
źródło