อักขระช่องว่างได้รับการจัดการอย่างไรในโมเดลวัตถุ XML
บางครั้ง โมเดลออบเจ็กต์ XML จะแสดงโหนด TEXT ที่มีอักขระช่องว่าง เมื่ออักขระช่องว่างถูกตัดทอน อาจก่อให้เกิดความสับสนได้ ตัวอย่างเช่น ตัวอย่าง XML ต่อไปนี้:
-
สมิธ
จอห์น
ต้นไม้ต่อไปนี้ถูกสร้างขึ้น:
คำสั่งการประมวลผล: xml
DocType: บุคคล
องค์ประกอบ: บุคคล
ข้อความ:
องค์ประกอบ: นามสกุล
ข้อความ:
องค์ประกอบ: ชื่อ
ข้อความ:
ชื่อและนามสกุลถูกล้อมรอบด้วยโหนด TEXT ที่มีเฉพาะอักขระช่องว่าง เนื่องจากโมเดลเนื้อหาขององค์ประกอบ "บุคคล" เป็น MIXED โดยมีคีย์เวิร์ด #PCDATA โมเดลเนื้อหาแบบผสมระบุว่าข้อความสามารถมีอยู่ระหว่างองค์ประกอบได้ ดังนั้นสิ่งต่อไปนี้จึงถูกต้องเช่นกัน:
นามสกุลของฉันคือสมิธ และชื่อแรกของฉันคือ
จอห์น
ผลลัพธ์ที่ได้คือต้นไม้ที่มีลักษณะดังต่อไปนี้:
องค์ประกอบ: บุคคล
ข้อความ: นามสกุลของฉันคือ
องค์ประกอบ: นามสกุล
ข้อความ: และชื่อของฉันคือ
องค์ประกอบ: ชื่อ
ข้อความ:
หากไม่มีอักขระช่องว่างหลังและก่อนคำว่า "เป็น" และอักขระช่องว่างหลังและก่อนคำว่า "และ" ประโยคจะไม่สามารถเข้าใจได้ ดังนั้น สำหรับโมเดลเนื้อหา MIXED การผสมข้อความ อักขระช่องว่าง และองค์ประกอบจึงมีความเกี่ยวข้องกันทั้งหมด นี่ไม่ใช่กรณีของโมเดลเนื้อหาที่ไม่ผสม
หากต้องการให้โหนดข้อความที่มีเฉพาะช่องว่างหายไป ให้ลบคีย์เวิร์ด #PCDATA ออกจากการประกาศองค์ประกอบ "บุคคล"
ผลลัพธ์คือโครงสร้างที่ชัดเจนต่อไปนี้:
คำสั่งการประมวลผล: xml
DocType: บุคคล
องค์ประกอบ: บุคคล
องค์ประกอบ: นามสกุล
องค์ประกอบ: ชื่อจริง
การประกาศ XML ทำหน้าที่อะไร?
การประกาศ XML จะต้องแสดงอยู่ที่ด้านบนของเอกสาร XML
โดยระบุรายการต่อไปนี้:
เอกสารนี้เป็นเอกสาร XML ตัวตรวจจับ MIME สามารถใช้สิ่งนี้เพื่อตรวจสอบว่าไฟล์เป็นประเภท text/xml หรือไม่ เมื่อไม่มีประเภท MIME หรือไม่ได้ระบุ
เอกสารนี้สอดคล้องกับข้อกำหนด XML 1.0 สิ่งนี้จะมีความสำคัญในอนาคตเมื่อมี XML เวอร์ชันอื่น
การเข้ารหัสอักขระเอกสาร แอตทริบิวต์การเข้ารหัสเป็นทางเลือกและมีค่าเริ่มต้นเป็น UTF-8
หมายเหตุ: การประกาศ XML ต้องอยู่ในบรรทัดแรกของเอกสาร XML ดังนั้นไฟล์ XML ต่อไปนี้:
ทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์ต่อไปนี้:
การประกาศ xml ไม่ถูกต้อง
บรรทัด 0000002:
ที่ตั้ง 0000007: ------^
หมายเหตุ: การประกาศ XML เป็นทางเลือก หากคุณต้องการระบุความคิดเห็นหรือคำแนะนำในการประมวลผลที่ด้านบน อย่าใส่การประกาศ XML อย่างไรก็ตาม การเข้ารหัสเริ่มต้นจะเป็น UTF-8
ฉันจะพิมพ์เอกสาร XML ในรูปแบบที่อ่านได้อย่างไร
เมื่อสร้างเอกสารตั้งแต่ต้นโดยใช้ DOM เพื่อสร้างไฟล์ XML ทุกอย่างจะอยู่ในบรรทัดเดียวโดยไม่มีช่องว่างระหว่างกัน นี่เป็นพฤติกรรมเริ่มต้น
สร้างสไตล์ชีต XSL เริ่มต้นใน Internet Explorer 5 เพื่อแสดงและพิมพ์เอกสาร XML ในรูปแบบที่อ่านได้ ตัวอย่างเช่น หากติดตั้ง IE5 ไว้แล้ว ให้ลองดูไฟล์ nospace.xml ต้นไม้ต่อไปนี้ควรปรากฏในเบราว์เซอร์:
-
-
เอ็กซ์วายซี
12.56
ไม่มีการแทรกอักขระช่องว่างใน XML
การพิมพ์ XML ที่อ่านได้นั้นน่าสนใจมาก โดยเฉพาะอย่างยิ่งเมื่อมี DTD ที่กำหนดโมเดลเนื้อหาประเภทต่างๆ ตัวอย่างเช่น ภายใต้โมเดลเนื้อหาแบบผสม (#PCDATA) คุณไม่สามารถแทรกช่องว่างได้ เนื่องจากอาจทำให้ความหมายของเนื้อหาเปลี่ยนไป ตัวอย่างเช่น พิจารณา XML ต่อไปนี้:
Elephant
นี่เป็นวิธีที่ดีที่สุดที่จะไม่ส่งออกเป็น:
E
ช้างเผือก
เพราะขอบเขตของคำไม่ถูกต้องอีกต่อไป
ทั้งหมดนี้ทำให้การพิมพ์อัตโนมัติเกิดปัญหา หากคุณไม่จำเป็นต้องพิมพ์ XML ที่อ่านได้ คุณสามารถใช้ DOM เพื่อแทรกอักขระช่องว่างเป็นโหนดข้อความในตำแหน่งที่เหมาะสม
จะใช้เนมสเปซใน DTD ได้อย่างไร หากต้องการใช้เนมสเปซใน DTD ให้ประกาศไว้ในการประกาศ ATTLIST ขององค์ประกอบที่ใช้ดังนี้:
ประเภทเนมสเปซต้องเป็น #FIXED เช่นเดียวกับเนมสเปซแอตทริบิวต์:
เนมสเปซและสกีมา XML DTD และสกีมา XML ไม่สามารถผสมกันได้ ตัวอย่างเช่นต่อไปนี้
xmlns:x CDATA #FIXED "x-schema:myschema.xml"
จะไม่ทำให้มีการใช้คำจำกัดความสคีมาที่กำหนดไว้ใน myschema.xml การใช้สกีมา DTD และ XML เป็นแบบแยกจากกัน
วิธีใช้ XMLDSO ใน Visual Basic
ใช้ XML ต่อไปนี้เป็นตัวอย่าง:
มาร์ค แฮนสัน
206 765 4583
เจน สมิธ
425 808 1111
คุณสามารถผูกเข้ากับชุดระเบียน ADO ได้ดังนี้:
สร้างโครงการ VB 6.0 ใหม่
เพิ่มการอ้างอิงถึง Microsoft ActiveX Data Objects 2.1 หรือใหม่กว่า, Microsoft Data Adapter Library และ Microsoft XML เวอร์ชัน 2.0
ใช้รหัสต่อไปนี้เพื่อโหลดข้อมูล XML ลงในตัวควบคุม XML DSO:
Dim dso เป็น XMLDSOControl ใหม่
Dim doc As IXMLDOMDocument
ตั้งค่า doc = dso.XMLDocument
doc.Load ("d:test.xml")
ใช้รหัสต่อไปนี้เพื่อแมป DSO เข้ากับวัตถุชุดระเบียนใหม่โดยใช้ DataAdapter:
เหมือนกับ DataAdapter ใหม่
ตั้งค่า da.Object = dso
Dim rs As ใหม่ ADODB.Recordset
ตั้งค่า rs.DataSource = da
เข้าถึงข้อมูล:
MsgBox rs.Fields("name").ค่า
ผลลัพธ์ในสตริง "Mark Hanson"
จะใช้ XML DOM ใน Java ได้อย่างไร?
ต้องติดตั้ง MSXML.DLL เวอร์ชัน IE5 ใน Visual J++ 6.0 เลือกเพิ่ม COM Wrapper จากเมนูโครงการ จากนั้นเลือก "Microsoft XML 1.0" จากรายการวัตถุ COM สิ่งนี้จะสร้าง wrapper Java ที่จำเป็นลงในแพ็คเกจใหม่ที่เรียกว่า "msxml" Wrapper Java ที่สร้างไว้ล่วงหน้าเหล่านี้พร้อมให้ดาวน์โหลดแล้วเช่นกัน สามารถใช้คลาสได้ดังนี้:
นำเข้า com.ms.com.*;
นำเข้า msxml.*;
ชั้นเรียนสาธารณะ Class1
-
โมฆะคงที่สาธารณะหลัก (String [] args)
-
เอกสาร DOMDocument = DOMDocument ใหม่ ();
doc.load(ตัวแปรใหม่(" file://d:/samples/ot.xml "));
System.out.println("โหลดแล้ว" + doc.getDocumentElement().getNodeName());
-
-
ตัวอย่างโค้ดจะโหลดไฟล์ทดสอบ 3.8MB "ot.xml" จากตัวอย่างศาสนาของดวงอาทิตย์ คลาส Variant ล้อมประเภทพื้นฐานของ Win32 VARIANT
เนื่องจากคุณได้รับ wrapper ใหม่ทุกครั้งที่คุณดึงข้อมูลโหนด คุณจึงไม่สามารถใช้การเปรียบเทียบตัวชี้บนโหนดได้ ดังนั้นอย่าใช้รหัสด้านล่าง
IXMLDOMNode root1 = doc.getDocumentElement();
IXMLDOMNode root2 = doc.getDocumentElement();
ถ้า (root1 == root2)...
ให้ใช้รหัสต่อไปนี้แทน:
ถ้า (ComLib.isEqualUnknown (root1, root2)) ....
ขนาดรวมของ wrapper .class มีขนาดประมาณ 160KB อย่างไรก็ตาม เพื่อให้สอดคล้องกับข้อกำหนด W3C โดยสมบูรณ์ ควรใช้เฉพาะ wrapper IXMLDOM* เท่านั้น คลาสต่อไปนี้เป็นอินเทอร์เฟซ IE 4.0 XML เก่าและสามารถลบออกจากโฟลเดอร์ msxml ได้:
IXMLแอตทริบิวต์*,
IXMLDocument*, XMLDocument*
IXMLEองค์ประกอบ*,
IXMLE ข้อผิดพลาด*,
IXMLElementCollection*,
แท็กXMLEMEM_TYPE*
_xml_error*
ซึ่งจะลดขนาดลงเหลือ 147KB คุณยังสามารถลบรายการต่อไปนี้ได้:
DOMFreeThreadedDocument
เข้าถึงเอกสาร XML จากหลายเธรดในแอปพลิเคชัน Java
XMLHttpRequest
ใช้ส่วนขยาย XML DAV HTTP เพื่อสื่อสารกับเซิร์ฟเวอร์
IXTLรันไทม์
กำหนดวัตถุสคริปต์สไตล์ชีต XSL
XMLDSOControl
เชื่อมโยงกับข้อมูล XML ในหน้า HTML
XMLDOMDocumentEvents
โทรกลับระหว่างการวิเคราะห์
ซึ่งจะลดขนาดลงเหลือ 116KB เพื่อให้มีขนาดเล็กลง ให้พิจารณาข้อเท็จจริงที่ว่า DOM นั้นมีสองชั้น: ชั้นหลักประกอบด้วย:
DOMDocument, IXMLDOMDocument
IXMLDOMโหนด*
IXMLDOMNodeList*
IXMLDOMNamedNodeMap*
IXMLDOMDocumentFragment*
IXMLDOMการใช้งาน
IXMLDOMParseError
และข้อมูล DTD ที่ผู้ใช้อาจจำเป็นต้องเก็บรักษา:
IXMLDOMDocumentType
IXMLDOMentity
IXMLDOMสัญลักษณ์
ประเภทโหนดทั้งหมดในเอกสาร XML คือ IXMLDOMNodes ซึ่งมีฟังก์ชันการทำงานเต็มรูปแบบ แต่มี Wrapper ระดับที่สูงกว่าสำหรับโหนดแต่ละประเภท ดังนั้น หากคุณแก้ไข wrapper DOMDocument และเปลี่ยนประเภทเฉพาะเหล่านี้เพื่อใช้ IXMLDOMNode อินเทอร์เฟซต่อไปนี้ทั้งหมดสามารถถูกลบออกได้:
IXMLDOMAแอตทริบิวต์
IXMLDOMCDATAมาตรา
IXMLDOMCharacterData
IXMLDOMความคิดเห็น
IXMLDOMEองค์ประกอบ
IXMLDOMคำสั่งการประมวลผล
IXMLDOMentityReference
IXMLDOMข้อความ
การนำสิ่งเหล่านี้ออกจะลดขนาดลงเหลือ 61KB อย่างไรก็ตาม สำหรับ IXMLDOMElement ทั้งเมธอด getAttribute และ setAttribute ก็มีประโยชน์ มิฉะนั้นคุณจะต้องใช้:
IXMLDOMNode.getAttributes().setNamedItem(...)