ฉันต้องใช้อักขระใดในการหลบหนีในเอกสาร XML


925

ต้องใช้อักขระใดบ้างในเอกสาร XML หรือฉันจะหารายการดังกล่าวได้จากที่ใด


7
ตัวอย่าง:<company>AT&amp;T</company>
jacktrades

ดูการย่อเอ็กเอ็มแอลอย่างง่าย ๆด้านล่างเพื่อคำแนะนำที่กระชับและจดจำได้ง่ายว่าฉันกลั่นจากแหล่งข้อมูลหลัก ( ภาษามาร์คอัป W3C Extensible Markup (XML) 1.0 (รุ่นที่ห้า )
kjhughes

คำตอบ:


1356

หากคุณใช้คลาสหรือห้องสมุดที่เหมาะสมพวกเขาจะหลบหนีให้คุณ ปัญหา XML หลายอย่างเกิดจากการต่อสตริง

อักขระยกเว้น XML

มีเพียงห้า:

"   &quot;
'   &apos;
<   &lt;
>   &gt;
&   &amp;

การหลีกเลี่ยงอักขระขึ้นอยู่กับตำแหน่งที่ใช้อักขระพิเศษ

ตัวอย่างที่สามารถตรวจสอบได้ที่W3C Markup การตรวจสอบการให้บริการ

ข้อความ

วิธีที่ปลอดภัยคือหลบหนีทั้งห้าตัวอักษรในข้อความ แต่ตัวละครทั้งสาม", 'และ>ไม่จำเป็นต้องหนีออกมาในข้อความ:

<?xml version="1.0"?>
<valid>"'></valid>

คุณลักษณะ

วิธีที่ปลอดภัยคือการหลีกเลี่ยงอักขระทั้งห้าในแอ็ตทริบิวต์ อย่างไรก็ตาม>ตัวละครไม่จำเป็นต้องถูกหลีกเลี่ยงในลักษณะ:

<?xml version="1.0"?>
<valid attribute=">"/>

'ตัวละครไม่จำเป็นต้องหนีแอตทริบิวต์ถ้าคำพูดที่มี":

<?xml version="1.0"?>
<valid attribute="'"/>

ในทำนองเดียวกันความ"จำเป็นที่ไม่ต้องหลบหนีในคุณลักษณะถ้าคำพูดคือ':

<?xml version="1.0"?>
<valid attribute='"'/>

ความคิดเห็น

อักขระพิเศษทั้งห้าจะต้องไม่ถูก Escape ในความคิดเห็น:

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>

CDATA

อักขระพิเศษทั้งห้าต้องไม่ถูกยกเว้นในส่วนของCDATA :

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>

คำแนะนำการประมวลผล

อักขระพิเศษทั้งห้าตัวต้องไม่ถูกยกเว้นในคำแนะนำในการประมวลผล XML:

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>

XML กับ HTML

HTML มีชุดรหัสการหลบหนีของตัวเองซึ่งครอบคลุมอักขระจำนวนมาก


33
@Pacerier ฉันขอให้คุณอย่าเขียนโค้ดหนี XML / HTML ของคุณเอง ใช้ฟังก์ชั่นห้องสมุดหรือคุณจะพลาดกรณีพิเศษ
Jason

5
นอกจากนี้สำหรับการขึ้นบรรทัดใหม่คุณต้องใช้ & # xA; & # xD; และ & # x9; สำหรับแท็บหากคุณต้องการอักขระเหล่านี้ในแอตทริบิวต์
radistao

78
หากคุณจะค้นหา / แทนที่สิ่งเหล่านี้เพียงจำไว้ว่าให้ทำ & amp; เปลี่ยนก่อนที่คนอื่น ๆ
Doug

2
@Doug ฉันเพิ่งจะพูดถึงสิ่งเดียวกันแน่นอน - มิฉะนั้นตัวละครที่ถูกแทนที่อื่น ๆ ทั้งหมดจะเสียหายและสิ่งต่าง ๆ เช่น&quot;นั้นจะเปลี่ยนเป็น&amp;quot;
Jerry Dodge

5
จากวิกิพีเดีย: "อักขระ Unicode ที่ได้รับอนุญาตทั้งหมดอาจแสดงด้วยการอ้างอิงอักขระตัวเลข" ดังนั้นจึงมีมากกว่า 5 ข้อ
ทิมคูเปอร์

93

บางทีนี่อาจช่วย:

รายการอ้างอิงเอนทิตีอักขระ XML และ HTML :

ใน SGML, เอกสาร HTML และ XML โครงสร้างเชิงตรรกะที่รู้จักกันในชื่อข้อมูลอักขระและค่าแอตทริบิวต์ประกอบด้วยลำดับของอักขระซึ่งอักขระแต่ละตัวสามารถแสดงรายการโดยตรง (แสดงถึงตัวมันเอง) หรือสามารถแสดงด้วยชุดอักขระที่เรียกว่าการอ้างอิงอักขระ ซึ่งมีอยู่สองประเภท: การอ้างอิงอักขระตัวเลขและการอ้างอิงเอนทิตีอักขระ บทความนี้แสดงรายการการอ้างอิงเอนทิตีอักขระที่ใช้ได้ในเอกสาร HTML และ XML

บทความนั้นแสดงเอนทิตี XML ที่กำหนดไว้ล่วงหน้าห้ารายการต่อไปนี้:

quot  "
amp   &
apos  '
lt    <
gt    >

73

ตามข้อกำหนดของ World Wide Web Consortium (w3C) มี 5 ตัวอักษรที่ต้องไม่ปรากฏในรูปแบบตัวอักษรในเอกสาร XMLยกเว้นเมื่อใช้เป็นตัวคั่นมาร์กอัปหรือภายในความคิดเห็นคำสั่งการประมวลผลหรือส่วน CDATA . ในทุกกรณีอื่น ๆ ตัวละครเหล่านี้จะต้องถูกแทนที่โดยใช้เอนทิตีที่สอดคล้องกันหรือการอ้างอิงตัวเลขตามตารางต่อไปนี้:

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

โปรดสังเกตว่าเอนทิตีดังกล่าวสามารถใช้ใน HTML ได้ยกเว้น& apos; ที่ถูกนำมาใช้กับ XHTML 1.0 และไม่ได้ประกาศใน HTML 4 ด้วยเหตุนี้และเพื่อให้แน่ใจว่ามีความเข้ากันได้ย้อนยุคข้อกำหนด XHTML แนะนำให้ใช้ & # 39; แทน.


14
XML กำหนดค่าเอนทิตีห้าเหล่านั้น แต่ไม่ได้ระบุอย่างแน่นอนว่าคุณไม่สามารถใช้อักขระห้าตัวใด ๆ ในรูปแบบตัวอักษรได้ <และ & จะต้องถูกหลบหนีไปทุกที่ (ยกเว้น CDATA) "และ" จะต้องได้รับการยกเว้นในค่าแอตทริบิวต์และเฉพาะถ้าอักขระเครื่องหมายคำพูดที่ตรงกันเหมือนกันและ> ไม่จำเป็นต้องหลบหนีจริงๆ
Shaun McCance

3
ตามที่เขียนไว้ด้านบน <> "& 'ไม่จำเป็นต้องถูกหลบหนีเมื่อใช้เป็นตัวคั่นมาร์กอัปหรือภายในความคิดเห็นคำแนะนำในการประมวลผลหรือส่วน CDATA เช่นเมื่อคุณใช้ <> เป็นแท็ก XML คุณจะไม่รอด . สิ่งเดียวกันสำหรับความคิดเห็น (คุณจะหลีกเลี่ยง & ในบรรทัดที่มีความคิดเห็นของไฟล์ XML หรือไม่คุณไม่จำเป็นต้องและ XML ของคุณยังคงถูกต้องหากคุณไม่ได้) สิ่งนี้ถูกระบุไว้อย่างชัดเจนในคำแนะนำอย่างเป็นทางการสำหรับ XML โดย W3C .
Albz

7
@ShaunMcCance >ต้องหนีออกมาถ้ามันตามมา]]ภายในเนื้อหายกเว้นว่ามันตั้งใจจะเป็นส่วนหนึ่งของ]]>ตัวคั่นที่ระบุจุดสิ้นสุดของส่วน CDATA
Lee D

2
เพื่อไม่ให้เป็นหมอผี แต่ @Albz ไม่ถูกต้องในการบอกว่าตัวละครเหล่านี้จะต้องได้รับสิทธิ์ในเนื้อหา ดูในส่วน 2.4 ที่w3.org/TR/REC-xml/#NT-CharData รุ่น TL; DR ของรุ่นนั้นอยู่ในเนื้อหาองค์ประกอบ chardata & amp; และ & lt; จะต้องได้รับสิทธิ์เสมอ แท็ก & gt; ตัวละครอาจได้รับอนุญาตแม้ว่ามันจะต้องเป็นเมื่อปรากฏในสตริงตัวอักษร“]]>” เพราะมิฉะนั้นจะถูกอ่านว่าเป็นตอนจบส่วน CDATA สำหรับคำพูดเดียวและสองคำพูดคุณสามารถหลบหนีถ้าคุณต้องการ นั่นคือมันสำหรับ Chardata ภายในองค์ประกอบ ส่วนประกอบอื่น ๆ ของ XML มีกฎอื่น ๆ
skye --- กัปตัน

52

การหลีกเลี่ยงอักขระแตกต่างกันสำหรับแท็กและแอตทริบิวต์

สำหรับแท็ก:

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;

สำหรับแอตทริบิวต์:

" &quot;
' &apos;

จากข้อมูลตัวละครและมาร์กอัป :

อักขระเครื่องหมายแอมเปอร์แซนด์ (&) และวงเล็บมุมซ้าย (<) ต้องไม่ปรากฏในรูปแบบตัวอักษรยกเว้นเมื่อใช้เป็นตัวคั่นมาร์กอัปหรือภายในความคิดเห็นคำสั่งการประมวลผลหรือส่วน CDATA หากจำเป็นต้องใช้ที่อื่นพวกเขาจะต้องหลบหนีโดยใช้การอ้างอิงอักขระตัวเลขหรือสตริง "& amp;" และ "& lt;" ตามลำดับ วงเล็บมุมขวา (>) อาจแสดงโดยใช้สตริง "& gt;" และต้องใช้ความสามารถในการเข้ากันได้โดยใช้ "& gt;" หรือการอ้างอิงอักขระเมื่อปรากฏในสตริง "]]>" ในเนื้อหา เมื่อสตริงนั้นไม่ได้ทำเครื่องหมายจุดสิ้นสุดของส่วน CDATA

หากต้องการอนุญาตให้ค่าแอตทริบิวต์มีทั้งเครื่องหมายอัญประกาศเดี่ยวและเครื่องหมายอัญประกาศคู่อักขระเครื่องหมายอัญประกาศเดี่ยวหรือเครื่องหมายอัญประกาศเดี่ยว (') อาจแสดงเป็น "& apos;" และอักขระเครื่องหมายคำพูดคู่ (") เป็น" & quot; "


นี่ก็หมายความว่าสำหรับแอททริบิวเท่านั้นที่จะต้องมีการหลีกหนีคำพูด แต่นั่นคือนอกเหนือไปจากตัวละครสามตัวอื่น ๆ
eug

40

ใหม่คำตอบที่ง่ายขึ้นสำหรับคำถามเก่าที่พบบ่อย ...

การจัดการ XML แบบง่าย(จัดลำดับความสำคัญเสร็จสมบูรณ์ 100%)

  1. เสมอ (90% สำคัญที่ต้องจำ)

    • หนี<เป็น&lt;เว้นแต่เป็นการเริ่มต้น<<tag/>
    • หนี&เป็น&amp;เว้นแต่เป็นการเริ่มต้น&&entity;
  2. ค่าคุณสมบัติ (9% สำคัญที่ต้องจำ)

    • attr=" 'คำพูดเดี่ยว'ก็โอเคภายในเครื่องหมายคำพูดคู่"
    • attr=' "เครื่องหมายคำพูดคู่"จะใช้ได้ภายในเครื่องหมายคำพูดเดี่ยว'
    • หนี"เป็น&quot;และ'เป็น&apos;อย่างอื่น
  3. ความคิดเห็น , CDATAและคำแนะนำในการประมวลผล (0.9% สำคัญที่ต้องจำ)

    • <!--ภายในความคิดเห็น -->ไม่ต้องมีการหลบหนี แต่ไม่--อนุญาตให้ใช้สตริง
    • <![CDATA[ภายในCDATA ]]>ไม่มีอะไรที่จะต้องหลบหนี แต่ไม่]]>อนุญาตให้ใช้สตริง
    • <?PITargetภายในPIs ?>ไม่มีอะไรที่ต้องหลบหนี แต่ไม่?>อนุญาตให้ใช้สตริง
  4. Esoterica (สำคัญ 0.1% ที่ต้องจำ)

    • หลบหนี]]>ราวกับ]]&gt;ว่า]]>กำลังจะสิ้นสุดส่วน CDATA
      (กฎนี้ใช้กับข้อมูลตัวอักษรโดยทั่วไป - แม้อยู่นอกส่วน CDATA)

กฎอีกข้อหนึ่งที่ควรค่าแก่การสังเกต: ]]>จะต้องได้รับการยกเว้นเป็น]]&gt;แม้ว่าจะไม่ได้อยู่ในส่วนของ CDATA วิธีที่ง่ายที่สุดในการบรรลุเป้าหมายที่อาจจะเสมอหลบหนีเป็น> &gt;
Michael Kay

ขอบคุณ @MichaelKay ฉันได้จัดตั้งขึ้นทราบประโยชน์ของคุณเกี่ยวกับ]]> แต่เลือกที่จะขับไล่มัน esoterica แทนที่จะบอกว่า> มักจะหนี (ซึ่งมันไม่จำเป็นต้องเป็นคุณรู้) เป้าหมายของฉันที่นี่เพื่อทำ XML กฎหลบหนีจดจำได้ง่าย และ ถูกต้อง 100%
kjhughes

คำตอบข้างต้นรวมถึงคำตอบที่ได้รับการยอมรับหนึ่งตัวละครทั้งห้าตัวควรจะถูกหลีกหนีจากภายในแอตทริบิวต์ คุณมีการอ้างอิงถึงมาตรฐาน XML เพื่อสนับสนุนสิ่งที่คุณพูดเนื่องจากคำตอบของคุณมีเหตุผลหรือไม่
Roman Susi

1
@RomanSusi: ใช่คำตอบอื่น ๆ อีกมากมายมีข้อผิดพลาดหรือ overgeneralizations ("วิธีที่ปลอดภัย ... ") ขึ้นอยู่กับคำบอกเล่า, การตีความที่ผิดหรือความเข้าใจผิดของ XML BNF อย่างเป็นทางการ คำตอบของฉันคือ (a) 100% เป็นธรรมโดยคำแนะนำ W3C XML; ดูการอ้างอิงที่เชื่อมโยงหลายอย่างไปยัง BNF อย่างเป็นทางการและ (b) ที่จัดระเบียบในการดำเนินการตามข้อกำหนดที่รัดกุมสมเหตุสมผลและจดจำได้ง่าย
kjhughes

@RomanSusi: คำสั่งเฉพาะที่ "ทั้งห้าตัวละครควรจะหนีภายในแอตทริบิวต์" เป็นคำแนะนำเลอะเทอะได้รับการสนับสนุนโดยกฎ BNF อย่างเป็นทางการสำหรับAttValueการอ้างถึงในคำตอบของฉันผ่านการเชื่อมโยงบน2. ค่าแอตทริบิวต์
kjhughes

25

นอกเหนือจากอักขระห้าตัวที่รู้จักกันทั่วไป [<,>, &, "และ '] แล้วฉันยังสามารถหลีกเลี่ยงอักขระแท็บแนวตั้ง (0x0B) ได้มันเป็น UTF-8 ที่ถูกต้อง แต่ไม่ใช่ XML 1.0 ที่ถูกต้องและแม้แต่ไลบรารีจำนวนมาก (รวมถึงไลบรารีlibxml2แบบพกพาสูง (ANSI C ) ที่พลาดไม่ได้และส่งออก XML ที่ไม่ถูกต้องอย่างเงียบ ๆ


11

สรุปโดย: XML, Escaping

มีเอนทิตีที่กำหนดไว้ล่วงหน้าห้ารายการ:

&lt; represents "<"
&gt; represents ">"
&amp; represents "&"
&apos; represents '
&quot; represents "

"อักขระ Unicode ที่ได้รับอนุญาตทั้งหมดอาจแสดงด้วยการอ้างอิงอักขระตัวเลข" ตัวอย่างเช่น:

&#20013;

อักขระควบคุมส่วนใหญ่และช่วง Unicode อื่น ๆ ได้รับการยกเว้นโดยเฉพาะความหมาย (ฉันคิดว่า) พวกเขาไม่สามารถหนีหรือควบคุมได้โดยตรง:

อักขระที่ถูกต้องใน XML


3

มันขึ้นอยู่กับบริบท สำหรับเนื้อหานั้นคือ<และ& , และ]]> (แม้ว่าจะเป็นสตริงสามตัวแทนที่จะเป็นหนึ่งตัวอักษร)

สำหรับค่าแอตทริบิวต์มันเป็น< , และ , "และ'

สำหรับ CDATA มันเป็น]]>


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