อะไรคือความแตกต่างระหว่าง#PCDATAและ#CDATAในDTD ?
#PCDATA CDATAไม่มีเป็นหลักและไม่มีPCDATA #CDATA
อะไรคือความแตกต่างระหว่าง#PCDATAและ#CDATAในDTD ?
#PCDATA CDATAไม่มีเป็นหลักและไม่มีPCDATA #CDATA
คำตอบ:
PCDATA - ข้อมูลตัวละครที่แยกวิเคราะห์
โดยปกติตัวแยกวิเคราะห์ XML จะแยกวิเคราะห์ข้อความทั้งหมดในเอกสาร XML
CDATA - (ไม่แยกวิเคราะห์) ข้อมูลอักขระ
คำว่า CDATA ใช้เกี่ยวกับข้อมูลข้อความที่ไม่ควรแยกวิเคราะห์โดยตัวแยกวิเคราะห์ XML
อักขระเช่น "<" และ "&" ผิดกฎหมายในองค์ประกอบ XML
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(ซึ่งถือว่าถูกต้องตามกฎหมาย)
#ไม่ใช่แฮชแท็ก เฉพาะแท็กที่นำหน้าด้วยสัญลักษณ์นี้เท่านั้นที่เป็นแฮชแท็ก สัญลักษณ์นี้มีหลายชื่อรวมถึง "เครื่องหมายตัวเลข" "เครื่องหมายปอนด์" (ส่วนใหญ่เป็นแคนาดาและสหรัฐอเมริกา) หรือเพียงแค่ "แฮช" (ดังนั้นชื่อ "แฮชแท็ก")
#PCDATAมีเหตุผลทางประวัติศาสตร์ มันจะมีเพราะใน DTD, องค์ประกอบยังอาจมีองค์ประกอบที่มีชื่อซึ่งจะต้องเป็นไปได้และซึ่งจะมีลักษณะเหมือนPCDATA <!ELEMENT foo (PCDATA)>
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>ที่นี่ค่าข้อความในครอบครัวจะเป็น
จากที่นี่ ( Google คือเพื่อนของคุณ ):
ใน DTD PCDATA และ CDATA ถูกใช้เพื่อยืนยันบางสิ่งเกี่ยวกับเนื้อหาที่อนุญาตขององค์ประกอบและคุณสมบัติตามลำดับ ในโมเดลเนื้อหาขององค์ประกอบ #PCDATA กล่าวว่าองค์ประกอบนั้นมี (อาจมี) "ข้อความเก่า ๆ " (มีข้อยกเว้นตามที่ระบุไว้ด้านล่าง) ในการประกาศแอตทริบิวต์ CDATA เป็นข้อ จำกัด ประเภทหนึ่งที่คุณสามารถใส่ค่าที่อนุญาตของแอตทริบิวต์ได้ (ประเภทอื่น ๆ รวมทั้ง ID, IDREF และ NMTOKEN) แอตทริบิวต์ที่มีค่าที่อนุญาตคือ CDATA สามารถ (เช่น PCDATA ในองค์ประกอบ) มี "ข้อความเก่า ๆ "
ปัญหาที่อาจทำให้สับสนจริงๆคือมี"CDATA" อีกอันหนึ่งที่เรียกว่าส่วนที่ทำเครื่องหมายไว้ ส่วนที่ทำเครื่องหมายคือส่วนของเนื้อหาองค์ประกอบ (#PCDATA) ที่คั่นด้วยสตริงพิเศษ: เพื่อปิด หากคุณจำได้ว่า PCDATA คือ "ข้อมูลอักขระที่แยกวิเคราะห์" ส่วน CDATA จะเหมือนกันทุกประการโดยไม่มี "แยกวิเคราะห์" พาร์เซอร์ส่งเนื้อหาของส่วนที่ทำเครื่องหมายไปยังแอปพลิเคชันดาวน์สตรีมโดยไม่ต้องสะดุดทุกครั้งที่พบอักขระพิเศษเช่น <และ & สิ่งนี้มีประโยชน์เมื่อคุณกำลังเข้ารหัสเอกสารที่มีอักขระพิเศษเหล่านั้นจำนวนมาก (เช่นสคริปต์และส่วนของโค้ด) ง่ายกว่าในการป้อนข้อมูลและอ่านง่ายกว่าการอ้างอิงเอนทิตีที่เกี่ยวข้อง
ดังนั้นคุณสามารถสรุปได้ว่าข้อยกเว้นของกฎ "ข้อความเก่าใด ๆ " ก็คือ PCDATA ไม่สามารถรวมอักขระพิเศษที่ไม่ใช้ Escape เหล่านี้ได้เว้นแต่จะอยู่ในขอบเขตของส่วนที่มีเครื่องหมาย CDATA
ความแตกต่างที่สำคัญมากระหว่าง PCDATA และ CDATA คือ
PCDATA - โดยทั่วไปใช้สำหรับ ELEMENTS ในขณะที่
CDATA - ใช้สำหรับแอตทริบิวต์ของ XML เช่น ATTLIST
CDATA ( C haracter DATA ): คล้ายกับความคิดเห็น แต่เป็นส่วนหนึ่งของเอกสาร กล่าวคือ CDATA เป็นข้อมูลเป็นส่วนหนึ่งของเอกสาร แต่ไม่สามารถแยกวิเคราะห์ข้อมูลใน XML ได้
หมายเหตุ:ความคิดเห็น XML จะละเว้นในขณะที่แยกวิเคราะห์ XML แต่ CDATA แสดงตามที่เป็นอยู่
PCDATA ( P arsed C haracter DATA ): โดยค่าเริ่มต้นทุกอย่างคือ PCDATA PCDATA เป็นข้อมูลที่สามารถแยกวิเคราะห์ใน XML