ความแตกต่างระหว่าง PCDATA และ CDATA ใน DTD


88

อะไรคือความแตกต่างระหว่าง#PCDATAและ#CDATAในDTD ?


1
เป็นไปได้ที่จะซ้ำกันของPCDATA และ CDATA คืออะไร?
Joshua Drake

ชื่อของคำที่ใช้ใน DTDs XML มีและ#PCDATA CDATAไม่มีเป็นหลักและไม่มีPCDATA #CDATA
mzjn

1
นอกจากคำตอบที่ยอมรับแล้วคุณควรอ่านstackoverflow.com/a/918462/2013911เพราะอธิบายความแตกต่างระหว่างประเภทแอตทริบิวต์ CDATA และส่วนที่ทำเครื่องหมาย <! [CDATA []]>
Niklas Peter

คำตอบ:


77

PCDATA - ข้อมูลตัวละครที่แยกวิเคราะห์

โดยปกติตัวแยกวิเคราะห์ XML จะแยกวิเคราะห์ข้อความทั้งหมดในเอกสาร XML

CDATA - (ไม่แยกวิเคราะห์) ข้อมูลอักขระ

คำว่า CDATA ใช้เกี่ยวกับข้อมูลข้อความที่ไม่ควรแยกวิเคราะห์โดยตัวแยกวิเคราะห์ XML

อักขระเช่น "<" และ "&" ​​ผิดกฎหมายในองค์ประกอบ XML


78
  • PCDATAคือข้อความที่จะถูกแยกวิเคราะห์โดยโปรแกรมแยกวิเคราะห์ แท็กภายในข้อความจะถือว่าเป็นมาร์กอัปและเอนทิตีจะถูกขยาย
  • CDATAคือข้อความที่จะไม่ถูกแยกวิเคราะห์โดยโปรแกรมแยกวิเคราะห์ แท็กภายในข้อความจะ ไม่ถือเป็นมาร์กอัปและเอนทิตีจะไม่ถูกขยาย

PCDATAโดยค่าเริ่มต้นทุกอย่างเป็น ในตัวอย่างต่อไปนี้การละเว้นรูท<bar>จะถูกแยกวิเคราะห์และจะไม่มีเนื้อหา แต่มีลูกเดียว

<?xml version="1.0"?>
<foo>
<bar><test>content!</test></bar>
</foo>

เมื่อเราต้องการระบุว่าองค์ประกอบจะมีเฉพาะข้อความและไม่มีองค์ประกอบลูกเราใช้คีย์เวิร์ดPCDATAเนื่องจากคีย์เวิร์ดนี้ระบุว่าองค์ประกอบต้องมีข้อมูลอักขระที่แยกวิเคราะห์ได้นั่นคือข้อความใด ๆ ยกเว้นอักขระที่น้อยกว่า ( <) มากกว่า ( >), เครื่องหมายและ ( &), อัญประกาศ ( ') และเครื่องหมายคำพูดคู่ ( ")

ในตัวอย่างถัดไป<bar>ประกอบด้วยCDATA. เนื้อหาจะไม่ถูกแยกวิเคราะห์และเป็นเช่น<test>content!</test>นั้น

<?xml version="1.0"?>
<foo>
<bar><![CDATA[<test>content!</test>]]></bar>
</foo>

SGML มีโมเดลเนื้อหาหลายแบบ #PCDATAโมเดลเนื้อหาบอกว่าเป็นองค์ประกอบที่อาจมีข้อความธรรมดา ส่วน "แยกวิเคราะห์" หมายความว่ามาร์กอัป (รวมถึง PI ความคิดเห็นและคำสั่ง SGML) ในส่วนนี้จะถูกแยกวิเคราะห์แทนที่จะแสดงเป็นข้อความดิบ นอกจากนี้ยังหมายความว่าการอ้างอิงเอนทิตีจะถูกแทนที่

CDATAอีกประเภทหนึ่งของรูปแบบเนื้อหาที่ช่วยให้เนื้อหาข้อความธรรมดาคือ ใน XML โมเดลเนื้อหาองค์ประกอบอาจไม่ได้ถูกตั้งค่าเป็นโดยปริยายCDATAแต่ใน SGML หมายความว่าการอ้างอิงมาร์กอัปและเอนทิตีจะถูกละเว้นในเนื้อหาขององค์ประกอบ อย่างไรก็ตามในแอตทริบิวต์CDATAประเภทการอ้างอิงเอนทิตีจะถูกแทนที่

ใน XML #PCDATAเป็นโมเดลเนื้อหาข้อความธรรมดาเท่านั้น คุณจะใช้ถ้าคุณต้องการอนุญาตให้มีเนื้อหาข้อความในองค์ประกอบ CDATAโมเดลเนื้อหาอาจถูกนำมาใช้อย่างชัดเจนผ่านCDATAมาร์กอัปกระชาก#PCDATAแต่เนื้อหาองค์ประกอบอาจไม่ได้รับการกำหนดให้เป็นCDATAต่อเริ่มต้น

ใน DTD CDATAประเภทของแอตทริบิวต์ที่มีข้อความจะต้องเป็น CDATAคำหลักในการประกาศแอตทริบิวต์มีความหมายที่แตกต่างกันกว่าCDATAส่วนในเอกสาร XML ในCDATAส่วนของตัวละครทุกตัวถูกต้องตามกฎหมาย (รวมทั้ง<, >, &, 'และ"ตัวอักษร) ยกเว้น]]>แท็กสิ้นสุด

#PCDATAไม่เหมาะสมกับประเภทของแอตทริบิวต์ ใช้สำหรับข้อความประเภท "ใบไม้"

#PCDATAมีแฮชในโมเดลเนื้อหานำหน้าเพื่อแยกความแตกต่างของคีย์เวิร์ดนี้จากองค์ประกอบที่มีชื่อว่าPCDATA(ซึ่งถือว่าถูกต้องตามกฎหมาย)


6
คำตอบที่ดียกเว้นประโยคสุดท้าย #ไม่ใช่แฮชแท็ก เฉพาะแท็กที่นำหน้าด้วยสัญลักษณ์นี้เท่านั้นที่เป็นแฮชแท็ก สัญลักษณ์นี้มีหลายชื่อรวมถึง "เครื่องหมายตัวเลข" "เครื่องหมายปอนด์" (ส่วนใหญ่เป็นแคนาดาและสหรัฐอเมริกา) หรือเพียงแค่ "แฮช" (ดังนั้นชื่อ "แฮชแท็ก")

6
#justhadtogetthatoffmychest

3
ฉันไม่เห็นด้วยว่า # ข้างหน้า#PCDATAมีเหตุผลทางประวัติศาสตร์ มันจะมีเพราะใน DTD, องค์ประกอบยังอาจมีองค์ประกอบที่มีชื่อซึ่งจะต้องเป็นไปได้และซึ่งจะมีลักษณะเหมือนPCDATA <!ELEMENT foo (PCDATA)>
Mathias Müller

ใบเสนอราคาและใบเสนอราคาสองครั้งถูกต้องตามกฎหมายในเนื้อหา PCDATA และเครื่องหมายแอมเพอร์แซนด์อาจปรากฏขึ้น แต่ (ใน XML) เป็นตัวแนะนำเอนทิตีเท่านั้น
Toby Speight

13

PCDATA - ข้อมูลอักขระที่แยกวิเคราะห์ จะแยกวิเคราะห์ข้อมูลทั้งหมดในเอกสาร XML

ตัวอย่าง:

<family>
    <mother>mom</mother>
    <father>dad</father>
</family>

ที่นี่<family>องค์ประกอบประกอบด้วยอีก 2 องค์ประกอบ: <mother>และ<father>. ดังนั้นจึงแยกวิเคราะห์เพิ่มเติมเพื่อให้ได้ข้อความของแม่และพ่อเพื่อให้ข้อความของครอบครัวเป็น"พ่อแม่"

CDATA - ข้อมูลอักขระที่ไม่ได้แยกวิเคราะห์ นี่คือข้อมูลที่ไม่ควรแยกวิเคราะห์เพิ่มเติมในเอกสาร xml

<family>
    <![CDATA[ 
       <mother>mom</mother>
       <father>dad</father>
    ]]>
</family>

<mother>mom</mother><father>dad</father>ที่นี่ค่าข้อความในครอบครัวจะเป็น


12

จากที่นี่ ( Google คือเพื่อนของคุณ ):

ใน DTD PCDATA และ CDATA ถูกใช้เพื่อยืนยันบางสิ่งเกี่ยวกับเนื้อหาที่อนุญาตขององค์ประกอบและคุณสมบัติตามลำดับ ในโมเดลเนื้อหาขององค์ประกอบ #PCDATA กล่าวว่าองค์ประกอบนั้นมี (อาจมี) "ข้อความเก่า ๆ " (มีข้อยกเว้นตามที่ระบุไว้ด้านล่าง) ในการประกาศแอตทริบิวต์ CDATA เป็นข้อ จำกัด ประเภทหนึ่งที่คุณสามารถใส่ค่าที่อนุญาตของแอตทริบิวต์ได้ (ประเภทอื่น ๆ รวมทั้ง ID, IDREF และ NMTOKEN) แอตทริบิวต์ที่มีค่าที่อนุญาตคือ CDATA สามารถ (เช่น PCDATA ในองค์ประกอบ) มี "ข้อความเก่า ๆ "

ปัญหาที่อาจทำให้สับสนจริงๆคือมี"CDATA" อีกอันหนึ่งที่เรียกว่าส่วนที่ทำเครื่องหมายไว้ ส่วนที่ทำเครื่องหมายคือส่วนของเนื้อหาองค์ประกอบ (#PCDATA) ที่คั่นด้วยสตริงพิเศษ: เพื่อปิด หากคุณจำได้ว่า PCDATA คือ "ข้อมูลอักขระที่แยกวิเคราะห์" ส่วน CDATA จะเหมือนกันทุกประการโดยไม่มี "แยกวิเคราะห์" พาร์เซอร์ส่งเนื้อหาของส่วนที่ทำเครื่องหมายไปยังแอปพลิเคชันดาวน์สตรีมโดยไม่ต้องสะดุดทุกครั้งที่พบอักขระพิเศษเช่น <และ & สิ่งนี้มีประโยชน์เมื่อคุณกำลังเข้ารหัสเอกสารที่มีอักขระพิเศษเหล่านั้นจำนวนมาก (เช่นสคริปต์และส่วนของโค้ด) ง่ายกว่าในการป้อนข้อมูลและอ่านง่ายกว่าการอ้างอิงเอนทิตีที่เกี่ยวข้อง

ดังนั้นคุณสามารถสรุปได้ว่าข้อยกเว้นของกฎ "ข้อความเก่าใด ๆ " ก็คือ PCDATA ไม่สามารถรวมอักขระพิเศษที่ไม่ใช้ Escape เหล่านี้ได้เว้นแต่จะอยู่ในขอบเขตของส่วนที่มีเครื่องหมาย CDATA


3

ความแตกต่างที่สำคัญมากระหว่าง PCDATA และ CDATA คือ

PCDATA - โดยทั่วไปใช้สำหรับ ELEMENTS ในขณะที่

CDATA - ใช้สำหรับแอตทริบิวต์ของ XML เช่น ATTLIST


0

CDATA ( C haracter DATA ): คล้ายกับความคิดเห็น แต่เป็นส่วนหนึ่งของเอกสาร กล่าวคือ CDATA เป็นข้อมูลเป็นส่วนหนึ่งของเอกสาร แต่ไม่สามารถแยกวิเคราะห์ข้อมูลใน XML ได้
หมายเหตุ:ความคิดเห็น XML จะละเว้นในขณะที่แยกวิเคราะห์ XML แต่ CDATA แสดงตามที่เป็นอยู่

PCDATA ( P arsed C haracter DATA ): โดยค่าเริ่มต้นทุกอย่างคือ PCDATA PCDATA เป็นข้อมูลที่สามารถแยกวิเคราะห์ใน XML

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