Apakah baris baru dalam nilai atribut XML diperbolehkan?

92

Saya menyadari bahwa itu tidak elegan atau diinginkan, tetapi apakah diperbolehkan (dalam format XML yang baik) untuk nilai atribut dalam elemen XML untuk menjangkau beberapa baris?

misalnya

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

Ya saya menyadari ada cara yang lebih baik untuk menulis itu. Saya pribadi akan menulisnya seperti:

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

atau:

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

Tapi kami memiliki pengurai XML sendiri dan saya ingin tahu apakah contoh pertama diizinkan dalam format XML yang baik.

CodeAndCats
sumber
1
Parser .NET XDocument menerima ini seperti yang diharapkan, tetapi nilai atribut dikembalikan dengan spasi, bukan umpan baris seperti yang akan ada dalam teks <value> sebagai contoh kedua Anda. (Pertanyaan Anda tidak khusus untuk .NET, tetapi data sampel saya adalah. Saya tidak tahu apakah ini bagian dari standar umum atau fitur .NET.)
Mark Hurd
1
Lihat juga stackoverflow.com/q/2004386/55452
David J.Liszewski
membuat contoh untuk pertanyaan serupa yang mempertahankan baris baru: stackoverflow.com/a/29782321/611007
n611x007

Jawaban:

102

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

Tampaknya mengatakan semuanya kecuali <, &dan pembatas Anda ( 'atau ") adalah OK. Jadi, baris baru juga harus begitu.

derobert
sumber
6
Salah satu contoh ketika baris baru merupakan ide bagus di dalam atribut adalah untuk atribut xsi: schemaLocation dalam konfigurasi Spring, yang dapat berisi beberapa URL yang dipisahkan oleh spasi dan karenanya lebih panjang dari lebar layar.
stivlo
3
itu valid namun parser akan menormalkannya ke ruang angkasa, seperti yang dikatakan Jan Cetkovsky .
n611x007
Yah ... Saya menggunakan banyak baris untuk pernyataan uji if / when dalam dokumen XSLT.
Nullius
51

Ini diperbolehkan, namun menurut rekomendasi W3C, pengurai XML Anda harus menormalkan semua karakter spasi putih menjadi spasi (0x20) - sehingga keluaran dari contoh Anda akan berbeda (Anda harus memiliki baris baru pada keluaran untuk "& # 13; & # 10 ; ", tetapi hanya spasi dalam kasus pertama).

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

Jan Cetkovsky
sumber
3

Hanya .NET: Jika Anda tidak yakin apakah string target adalah atribut xml yang valid (dan memberikan nilai atribut ini melalui kode), Anda selalu dapat menggunakan fungsi SecurityElement.Escape untuk menghindari karakter yang tidak valid.

Menurut deskripsi fungsi ini, satu-satunya karakter yang tidak valid adalah:

<, >, &, ',"

Dan ini berarti (seperti yang ditulis oleh pendahulu saya), baris baru itu seharusnya OK.

Łukasz Wiatrak
sumber
2

Ya, contoh pertama adalah yang valid.

Reji
sumber