อนุญาตให้มีการแบ่งบรรทัดในค่าแอตทริบิวต์ 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 ที่มีรูปแบบดีหรือไม่


1
ตัวแยกวิเคราะห์. NET XDocument ยอมรับสิ่งนี้ตามที่คาดไว้ แต่ค่าแอ็ตทริบิวต์จะถูกส่งกลับด้วยช่องว่างไม่ใช่ฟีดบรรทัดเนื่องจากจะอยู่ในข้อความ <value> ดังตัวอย่างที่สอง (คำถามของคุณไม่ได้เจาะจงเฉพาะ. NET แต่เป็นข้อมูลตัวอย่างของฉันฉันไม่รู้ว่านี่เป็นส่วนหนึ่งของมาตรฐานทั่วไปหรือฟีเจอร์. NET)
Mark Hurd


ทำตัวอย่างคำถามที่คล้ายกันซึ่งคงขึ้นบรรทัดใหม่: 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

ดูเหมือนว่าจะพูดทุกอย่างยกเว้น<, &และตัวคั่นคุณ ( 'หรือ") จะ OK ดังนั้นจึงควรขึ้นบรรทัดใหม่ด้วย


6
ตัวอย่างหนึ่งเมื่อบรรทัดใหม่เป็นความคิดที่ดีในแอตทริบิวต์คือสำหรับ xsi: schemaLocation แอตทริบิวต์ในการกำหนดค่า Spring ซึ่งสามารถมี URL หลายรายการที่คั่นด้วยช่องว่างและยาวกว่าความกว้างของหน้าจอมาก
stivlo

3
มันเป็นเรื่องที่ถูกต้อง แต่ parser จะปกติพวกเขาไปยังพื้นที่แจ Cetkovsky กล่าวว่า
n611x007

ฉันใช้หลายบรรทัดเป็นเวลานาน if / when test statement ในเอกสาร XSLT
Nullius

51

อนุญาตอย่างไรก็ตามตามคำแนะนำของ W3C ตัวแยกวิเคราะห์ XML ของคุณควรทำให้อักขระช่องว่างทั้งหมดเป็นช่องว่าง (0x20) - ดังนั้นผลลัพธ์ของตัวอย่างของคุณจะแตกต่างกัน (คุณควรมีบรรทัดใหม่ในเอาต์พุตสำหรับ "& # 13; & # 10 ; "แต่เว้นวรรคในกรณีแรกเท่านั้น)

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


3

.NET เท่านั้น: หากคุณไม่แน่ใจว่าสตริงเป้าหมายเป็นแอตทริบิวต์ xml ที่ถูกต้องหรือไม่ (และระบุค่าของแอตทริบิวต์นี้ผ่านรหัส) คุณสามารถใช้ฟังก์ชันSecurityElement.Escapeเพื่อหลีกเลี่ยงอักขระที่ไม่ถูกต้องได้ตลอดเวลา

ตามคำอธิบายของฟังก์ชันนี้อักขระที่ไม่ถูกต้องคือ:

<, >, &, ',"

และนี่หมายความว่า (ตามที่รุ่นก่อนของฉันเขียนไว้) บรรทัดใหม่นั้นควรจะใช้ได้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.