ผู้แต่ง: AngelGavin ที่มา: CSDN
จะโหลดเอกสารที่มีอักขระต่างประเทศและอักขระพิเศษได้อย่างไร
เอกสารสามารถมีอักขระต่างประเทศได้ เช่น:
ตัวอักษรต่างประเทศ (úóí?)
ตัวอย่างเช่น อักขระต่างประเทศ เช่น 粲 ต้องนำหน้าด้วยลำดับหลีก อักขระต่างประเทศสามารถเข้ารหัส UTF-8 หรือระบุด้วยการเข้ารหัสอื่นได้ดังนี้:
ตัวอักษรต่างประเทศ (?磲)
ขณะนี้ XML โหลดอย่างถูกต้องแล้ว
อักขระอื่นๆ ถูกสงวนไว้ใน XML และจำเป็นต้องได้รับการจัดการแตกต่างออกไป XML ด้านล่าง:
สิ่งนี้และสิ่งนั้น
เกิดข้อผิดพลาดต่อไปนี้:
ที่นี่ไม่อนุญาตให้มีช่องว่าง
บรรทัด 0000001: สิ่งนี้ & นั่น
ที่ตั้ง 0000012: ----------^
ที่นี่ & เป็นส่วนหนึ่งของโครงสร้างไวยากรณ์ XML หากวางไว้ภายในแหล่งข้อมูล XML จะไม่สามารถตีความว่าเป็น & ได้ คุณต้องแทนที่ลำดับอักขระพิเศษที่เรียกว่า "เอนทิตี"
สิ่งนี้และสิ่งนั้น
อักขระต่อไปนี้จำเป็นต้องมีเอนทิตีที่สอดคล้องกัน:
-
-
-
-
''
อักขระเครื่องหมายคำพูดใช้เป็นตัวคั่นสำหรับค่าแอตทริบิวต์ในมาร์กอัป ดังนั้นโดยทั่วไปจึงไม่สามารถนำมาใช้ภายในค่าแอตทริบิวต์ได้ ตัวอย่างเช่น ข้อมูลต่อไปนี้จะส่งคืนข้อผิดพลาด:
เครื่องหมายคำพูดเดี่ยวที่นี่ใช้ทั้งเป็นตัวคั่นแอตทริบิวต์และภายในค่าแอตทริบิวต์เอง เพื่อแก้ไขปัญหานี้ คุณสามารถเปลี่ยนตัวคั่นแอตทริบิวต์เป็นเครื่องหมายคำพูดคู่:
หรือคุณสามารถหลีกเลี่ยงเครื่องหมายคำพูดเดี่ยวไปยังเอนทิตีได้
ทั้งสองวิธีข้างต้นจะส่งคืนค่าแอตทริบิวต์ John's Stuff ผ่านวิธี getAttribute ในโมเดลอ็อบเจ็กต์ XML ในทำนองเดียวกันสำหรับเครื่องหมายคำพูดคู่ คุณสามารถใช้เอนทิตี "
คุณยังสามารถจัดการอักขระพิเศษในเนื้อหาองค์ประกอบได้โดยการวางข้อความในส่วน CDATA ข้อมูลต่อไปนี้ถูกต้อง:
ในตัวอย่างนี้ โมเดลอ็อบเจ็กต์ XML จะแสดงโหนด CDATA เป็นโหนดลูกของโหนด xml ซึ่งส่งคืนสตริง
This & that is just "text" content
เป็น nodeValue
จะใช้ส่วนประกอบ MSXML COM ใน Visual Studio 6.0 C++ ได้อย่างไร
วิธีที่ง่ายที่สุดในการใช้คอมโพเนนต์ MSXML COM ใน Visual C++ 6.0 คือการใช้คำสั่ง #import:
#import "msxml.dll" name_guids no_namespace#import "msxml.dll" name_guids no_namespace
โดยกำหนดอินเทอร์เฟซ IXML* และ ID อินเทอร์เฟซทั้งหมดเพื่อให้สามารถใช้ในแอปพลิเคชันได้ ไลบรารีประเภท MSXML และไฟล์ส่วนหัว (เป็นภาษาอังกฤษ) มีให้จาก INETSDK เช่นเดียวกับ uuid.lib ที่มีคลาส IID
วิธีการใช้เอนทิตี HTML ใน XML?
XML ต่อไปนี้มีเอนทิตี HTML:
ลิขสิทธิ์ ? 2000, Microsoft Inc. สงวนลิขสิทธิ์
มันทำให้เกิดข้อผิดพลาดต่อไปนี้:
การอ้างอิงถึง 'สำเนา' เอนทิตีที่ไม่ได้กำหนด
บรรทัด: 1 ตำแหน่ง: 23 รหัสข้อผิดพลาด: 0xC00CE002
ลิขสิทธิ์ ? 2000, ...
-
เนื่องจาก XML มีเอนทิตีที่มีอยู่แล้วภายในเพียงห้ารายการเท่านั้น สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเอนทิตีที่มีอยู่แล้วภายใน ดู ฉันจะโหลดเอกสารที่มีอักขระต่างประเทศและอักขระพิเศษได้อย่างไร -
หากต้องการใช้เอนทิตี HTML คุณต้องกำหนดด้วย DTD สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ DTD โปรดดูคำแนะนำ W3C XML (เป็นภาษาอังกฤษ) หากต้องการใช้ DTD นี้ ให้รวมไว้ในแท็ก DOCTYPE โดยตรง ดังนี้:
ลิขสิทธิ์ ? 2000, Microsoft Inc. สงวนลิขสิทธิ์
หากต้องการโหลด คุณจะต้องปิดแอตทริบิวต์ validateOnParse ของอินเทอร์เฟซ IXMLDOMDocument ลองวางลงในหน้าทดสอบ Validator ปิดการตรวจสอบ DTD แล้วคลิกตรวจสอบ โปรดสังเกตว่าเอกสารโหลดและอักขระลิขสิทธิ์ปรากฏในแผนผัง DOM ที่ส่วนท้ายของหน้าเครื่องมือตรวจสอบ
หากการตรวจสอบ DTD เสร็จสมบูรณ์ เอนทิตี HTML ที่เป็นเอนทิตีพารามิเตอร์จะต้องรวมอยู่ใน DTD ที่มีอยู่ดังนี้:
%HTMLENT;
%HTMLENT;
มันจะกำหนดเอนทิตี HTML ทั้งหมดเพื่อให้สามารถใช้ในเอกสาร XML
วิธีจัดการกับอักขระช่องว่างในเนื้อหาองค์ประกอบ
XML DOM มีสามวิธีในการเข้าถึงเนื้อหาต้นฉบับขององค์ประกอบ:
ลักษณะการทำงานแอตทริบิวต์
nodeValue ส่งคืนเนื้อหาต้นฉบับ (รวมถึงอักขระช่องว่าง) บนโหนด TEXT, CDATA, COMMENT และ PI ตามที่ระบุไว้ในแหล่ง XML ดั้งเดิม สำหรับโหนด ELEMENT และ DOCUMENT เอง ค่า null จะถูกส่งกลับ
Data Same as nodeValue
Text Repeat จะเชื่อมโหนด TEXT และ CDATA หลายโหนดเข้าด้วยกันในแผนผังย่อยที่ระบุและส่งกลับผลลัพธ์ที่รวมกัน
หมายเหตุ: อักขระช่องว่างประกอบด้วยบรรทัด แท็บ และช่องว่างใหม่
คุณสมบัติ nodeValue มักจะส่งคืนเนื้อหาของเอกสารต้นฉบับ โดยไม่คำนึงถึงวิธีการโหลดเอกสารและขอบเขต xml:space ปัจจุบัน
แอตทริบิวต์ text เชื่อมต่อข้อความทั้งหมดในแผนผังย่อยที่ระบุและขยายเอนทิตี สิ่งนี้เกี่ยวข้องกับวิธีการโหลดเอกสาร สถานะปัจจุบันของสวิตช์ PreservWhiteSpace และขอบเขต xml:space ปัจจุบัน ดูด้านล่าง:
PreservWhiteSpace = true เมื่อโหลดเอกสาร
PreservWhiteSpace=true | PreservWhiteSpace=true | PreservWhiteSpace=false | PreservWhiteSpace=false |
xml:space=preserve | xml:space=default | xml:space=preserve | xml:space=default |
เก็บรักษา | เก็บ | รักษา | เก็บรักษา และตัดทอน เก็บรักษา |
WhiteSpace = false เมื่อเอกสารถูกโหลด
PreserveWhiteSpace=true | PreservWhiteSpace=true | PreservWhiteSpace=false PreserveWhiteSpace= | false |
xml:space=preserve | xml:space=default | xml:space=preserve | xml:space=default |
half-preserve | half-preserve and truncate | half-preserve | half-preserve and truncate |
preserve ที่นี่ หมายถึง และ เนื้อหาข้อความต้นฉบับที่เหมือนกันทุกประการในเอกสาร XML ต้นฉบับ ความหมายที่ถูกตัดทอนช่องว่างนำหน้าและต่อท้ายได้ถูกลบออก ความหมายแบบกึ่งสงวนไว้ "อักขระช่องว่างที่สำคัญ" จะถูกเก็บรักษาไว้ และ "อักขระช่องว่างที่ไม่สำคัญ" ถูกทำให้เป็นมาตรฐาน อักขระช่องว่างที่สำคัญคืออักขระช่องว่างภายในเนื้อหาข้อความ อักขระช่องว่างที่ไม่สำคัญคืออักขระช่องว่างระหว่างโทเค็น มีลักษณะดังนี้:
n
tเจนn
tสมิธ n
ในตัวอย่างนี้ สีแดงเป็นอักขระช่องว่างที่ไม่สำคัญซึ่งสามารถละเว้นได้ ในขณะที่สีเขียวเป็นอักขระช่องว่างที่สำคัญเนื่องจากเป็นส่วนหนึ่งของเนื้อหาข้อความ ดังนั้นจึงมีความหมายสำคัญที่ไม่สามารถละเลยได้ ดังนั้นในตัวอย่างนี้ คุณสมบัติข้อความจะส่งกลับค่าต่อไปนี้:
ค่าที่ส่งกลับสถานะยังคงเป็น "nt JanentSmith n"
เก็บและตัดทอน "JanentSmith"
กึ่งจอง “เจน สมิธ”
รักษาครึ่งหนึ่งและตัดทอน "Jane Smith"
โปรดทราบว่า "รักษาครึ่งหนึ่ง" จะทำให้อักขระช่องว่างที่ไม่สำคัญเป็นมาตรฐาน เช่น อักขระขึ้นบรรทัดใหม่และอักขระแท็บจะถูกลดให้เหลือช่องว่างเดียว หากคุณเปลี่ยนแอตทริบิวต์ xml:space และสวิตช์รักษาWhiteSpace คุณสมบัติข้อความจะส่งกลับค่าที่แตกต่างกันตามลำดับ
CDATA และ xml:space="preserve" ขอบเขตทรีย่อย
ในตัวอย่างต่อไปนี้ เนื้อหาของโหนด CDATA หรือโหนด "ที่สงวนไว้" จะถูกต่อกันเนื่องจากไม่ได้มีส่วนร่วมในการทำให้เป็นมาตรฐานอักขระช่องว่างที่ไม่สำคัญ ตัวอย่างเช่น:
n
t เจน n
t สมิธ ]>n
ในกรณีนี้ อักขระช่องว่างภายในโหนด CDATA จะไม่ "รวม" กับอักขระช่องว่าง "ไม่สำคัญ" อีกต่อไป และไม่ถูกตัดทอน ดังนั้นกรณี "half-preserved and truncated" จะส่งกลับค่าต่อไปนี้:
"Jane Smith"
ที่นี่ อักขระช่องว่างที่ไม่สำคัญระหว่างแท็ก และ จะถูกรวมไว้ โดยไม่คำนึงถึงเนื้อหาของโหนด CDATA หากคุณแทนที่ CDATA ด้วยค่าต่อไปนี้ ผลลัพธ์เดียวกันจะถูกส่งกลับ:
Smith
เอนทิตีเป็นเอนทิตีพิเศษ
ที่โหลดและแยกวิเคราะห์เป็นส่วนหนึ่งของ DTD และแสดงภายใต้โหนด DOCTYPE โดยไม่จำเป็นต้องมีขอบเขต xml:space ตัวอย่างเช่น:
เจนn
tn
-
-
&เจน;
สมมติว่า PreservWhiteSpace=false (ในขอบเขตแท็ก DOCTYPE) อักขระช่องว่างที่ไม่สำคัญจะหายไปเมื่อแยกวิเคราะห์เอนทิตี เอนทิตีจะไม่มีโหนดอักขระช่องว่าง ต้นไม้จะมีลักษณะดังนี้:
DOCTYPE ฟู
นิติบุคคล: เจน
องค์ประกอบ: พนักงาน
องค์ประกอบ: ชื่อ
ข้อความ: เจน
องค์ประกอบ: ชื่อเรื่อง
ข้อความ>:วิศวกรออกแบบซอฟต์แวร์
องค์ประกอบ: ฟู
คุณลักษณะ: xml:space="preserve"
เอนทิตีอ้างอิง: เจน
โปรดทราบว่าแผนผัง DOM ที่เปิดเผยภายใต้โหนด ENTITY ภายใน DOCTYPE ไม่มีโหนด WHITESPACE ใดๆ ซึ่งหมายความว่าโหนดลูกของโหนด ENTITYREF ยังไม่มีโหนด WHITESPACE แม้ว่าการอ้างอิงเอนทิตีจะอยู่ภายในขอบเขตของ xml:space="preserve" ก็ตาม
แต่ละอินสแตนซ์ของ ENTITY ที่อ้างอิงในเอกสารที่กำหนดมักจะมีแผนผังเดียวกัน
หากเอนทิตีต้องคงอักขระช่องว่างไว้อย่างแน่นอน จะต้องระบุแอตทริบิวต์ xml:space ของตัวเองเป็นการภายใน หรือต้องตั้งค่าสวิตช์รักษาเอกสาร WhiteSpace ให้เป็นจริง
วิธีจัดการกับอักขระช่องว่างในแอตทริบิวต์?
มีหลายวิธีในการเข้าถึงมูลค่าทรัพย์สิน อินเทอร์เฟซ IXMLDOMAttribute มีแอตทริบิวต์ nodeValue ซึ่งเทียบเท่ากับแอตทริบิวต์ nodeValue และข้อความเป็นส่วนขยายของ Microsoft คุณสมบัติเหล่านี้ส่งคืน: ข้อความที่ส่งคืนโดยคุณสมบัติ
attrNode.nodeValue
attrNode.value
getAttribute("name") ส่งคืนเนื้อหาเดียวกันทุกประการ (และเอนทิตีแบบขยาย) เช่นเดียวกับในเอกสารต้นฉบับ
attrNode.nodeTypedValue เป็นโมฆะ
attrNode.text เหมือนกับ nodeValue ยกเว้นว่าอักขระช่องว่างนำหน้าและต่อท้ายถูกตัดทอน
ข้อมูลจำเพาะ "ภาษา XML" กำหนดลักษณะการทำงานต่อไปนี้สำหรับแอปพลิเคชัน XML: ประเภทแอตทริบิวต์ ข้อความที่ส่งคืน CDATA ID, IDREF, IDREFS, ENTITY, เอนทิตี, สัญลักษณ์, การแจงนับ การ
ทำให้เป็นมาตรฐานแบบกึ่งปกติ การทำให้เป็นมาตรฐานแบบสมบูรณ์
ที่นี่ การทำให้เป็นมาตรฐานแบบกึ่งที่นี่แสดงถึงการแปลงบรรทัดใหม่และอักขระแท็บ เป็นช่องว่าง แต่ช่องว่างหลายช่องจะไม่เสื่อมลงเป็นช่องเดียว