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.


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,



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ć.


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


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.