อะไรคือความแตกต่างระหว่าง#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