SAX กับ DOM ต่างกันอย่างไร


242

ผมอ่านบทความบางอย่างเกี่ยวกับXML parsers และมาข้ามSAXและDOM

SAXเป็นแบบอิงเหตุการณ์และDOMเป็นโมเดลต้นไม้ - ฉันไม่เข้าใจความแตกต่างระหว่างแนวคิดเหล่านี้

จากสิ่งที่ฉันเข้าใจเหตุการณ์ตามหมายถึงเหตุการณ์บางอย่างเกิดขึ้นกับโหนด เช่นเดียวกับเมื่อคลิกที่โหนดหนึ่งมันจะให้โหนดย่อยทั้งหมดแทนที่จะโหลดโหนดทั้งหมดในเวลาเดียวกัน แต่ในกรณีของการแยกวิเคราะห์DOMมันจะโหลดโหนดทั้งหมดและสร้างโมเดลทรี

ความเข้าใจของฉันถูกต้องหรือไม่

โปรดแก้ไขให้ฉันถ้าฉันผิดหรืออธิบายให้ฉันตามเหตุการณ์และโมเดลต้นไม้ในลักษณะที่เรียบง่ายขึ้น


การพูดอย่างถูกต้อง DOM ไม่ใช่ตัวแยกวิเคราะห์ ซอฟต์แวร์ที่ใช้ DOM ใด ๆ ที่ระบุอาจมีหรือไม่มีการแยกวิเคราะห์มาร์กอัปและซอฟต์แวร์ HTML DOM ส่วนใหญ่จะทำ แต่ DOM เป็นสิ่งที่แยกกันโดยสิ้นเชิงซึ่งอาจไม่เกี่ยวข้องกับรูปแบบการทำให้เป็นอนุกรมเลย
Bob77

คำตอบ:


305

คุณอยู่ใกล้แล้ว

ใน SAX เหตุการณ์จะถูกเรียกเมื่อ XML จะถูกแยกวิเคราะห์ เมื่อ parser แยกวิเคราะห์ XML และพบแท็กเริ่มต้น (เช่น<something>) จากนั้นจะทริกเกอร์tagStartedเหตุการณ์ (ชื่อจริงของเหตุการณ์อาจแตกต่างกัน) ในทำนองเดียวกันเมื่อตอนท้ายของแท็กจะพบในขณะที่การแยก ( </something>) tagEndedมันทริกเกอร์ การใช้ตัวแยกวิเคราะห์ SAX หมายความว่าคุณต้องจัดการกับเหตุการณ์เหล่านี้และทำความเข้าใจกับข้อมูลที่ส่งคืนด้วยแต่ละเหตุการณ์

ใน DOM ไม่มีเหตุการณ์ที่ถูกเรียกขณะแยกวิเคราะห์ XML ทั้งหมดถูกวิเคราะห์คำและต้นไม้ DOM (ของโหนดใน XML) ถูกสร้างและส่งคืน เมื่อแยกวิเคราะห์แล้วผู้ใช้สามารถนำทางต้นไม้เพื่อเข้าถึงข้อมูลต่างๆที่ฝังไว้ก่อนหน้านี้ในโหนดต่างๆใน XML

โดยทั่วไปแล้ว DOM นั้นใช้งานง่ายกว่า แต่มีค่าใช้จ่ายในการแยกวิเคราะห์ XML ทั้งหมดก่อนที่คุณจะเริ่มใช้งาน


135
+1 - เพื่อชี้แจง: ใช้ตัวแยกวิเคราะห์ DOM กับไฟล์ขนาดเล็กที่พอดีกับ RAM ใช้ SAX parser สำหรับไฟล์ขนาดใหญ่ที่ไม่ใช้
Richard H

ขอบคุณ @spartkymat แต่ในกรณีของเหตุการณ์ SAX ตามตัวแยกวิเคราะห์ SAX จะสามารถรู้ว่าโหนดลูกโดยเฉพาะเป็นลูกของผู้ปกครองโดยเฉพาะ? หรือเพียงแค่มันจะแยกวิเคราะห์? ตัวอย่างเช่น. ฉันมี <company> หนึ่งอันและลูกคือ <employee> ดังนั้นในกรณีนี้ บริษัท และพนักงานเหล่านั้นจะถูกแยกวิเคราะห์หรือจะแสดงความสัมพันธ์ที่ บริษัท เป็นผู้ปกครองของพนักงานหรือไม่
user414967

4
มันจะแยกเท่านั้น คุณจะต้องรักษาข้อมูลดังกล่าวด้วยตนเอง (ผ่านเครื่องรัฐหรืออย่างอื่น) เหตุผลเพิ่มเติมทั้งหมดในการใช้เครื่องมือแยกวิเคราะห์ DOM (หากทรัพยากรอนุญาต) :-)
sparkymat

1
@ ริชาร์ด H ฉันขอยืนยันว่าทุกคนที่ใช้ไฟล์ XML ขนาดใหญ่มากจนไม่เหมาะกับ RAM ก็กำลังทำอะไรผิดพลาดอยู่
2560

1
โหลด excel ขนาด 40m ใช้หน่วยความจำ 200m เมื่อใช้ SAX parser แต่ใช้หน่วยความจำ 9g เมื่อใช้ DOM parser
zhiyuan_

98

เพียงไม่กี่คำ ...

แซ็กโซโฟน ( S Imple PI สำหรับX ML): เป็นหน่วยประมวลผลสตรีมตาม คุณมีส่วนเล็ก ๆ ในหน่วยความจำตลอดเวลาและคุณ "ดมกลิ่น" สตรีม XML ด้วยการใช้รหัสโทรกลับสำหรับกิจกรรมเช่นฯลฯ มันใช้หน่วยความจำเกือบจะไม่ แต่คุณไม่สามารถทำสิ่ง "DOM" เช่นใช้ xpath หรือทราเวิร์ส ต้นไม้tagStarted()

DOM ( D ocument O bject M Odel): คุณโหลดสิ่งที่ทั้งในหน่วยความจำ - มันเป็นหมูหน่วยความจำมาก คุณสามารถเป่าหน่วยความจำด้วยเอกสารขนาดกลาง แต่คุณสามารถใช้ xpath และสำรวจต้นไม้เป็นต้น


66

ที่นี่ด้วยคำพูดที่ง่ายกว่า:

DOM

  • Tree model parser (อิงตาม Object) (Tree of nodes)

  • DOM โหลดไฟล์ลงในหน่วยความจำแล้วทำการแยกวิเคราะห์ไฟล์

  • มีข้อ จำกัด ของหน่วยความจำเนื่องจากโหลดไฟล์ XML ทั้งหมดก่อนที่จะแยกวิเคราะห์

  • DOM คืออ่านและเขียน (สามารถแทรกหรือลบโหนด)

  • หากเนื้อหา XML มีขนาดเล็กให้เลือก DOM parser

  • การค้นหาย้อนหลังและไปข้างหน้าเป็นไปได้สำหรับการค้นหาแท็กและการประเมินผลข้อมูลภายในแท็ก ดังนั้นสิ่งนี้ให้ความสะดวกในการนำทาง

  • ช้าลงในเวลาทำงาน

แซ็กโซโฟน

  • ตัวแยกวิเคราะห์ตามเหตุการณ์ (ลำดับเหตุการณ์)

  • SAX แยกวิเคราะห์ไฟล์ในขณะที่อ่านมันคือแยกวิเคราะห์โหนดโดยโหนด

  • ไม่มีข้อ จำกัด ด้านหน่วยความจำเนื่องจากไม่ได้จัดเก็บเนื้อหา XML ในหน่วยความจำ

  • SAX เป็นแบบอ่านอย่างเดียวนั่นคือไม่สามารถแทรกหรือลบโหนดได้

  • ใช้ SAX parser เมื่อเนื้อหาหน่วยความจำมีขนาดใหญ่

  • SAX อ่านไฟล์ XML จากบนลงล่างและการนำทางย้อนกลับเป็นไปไม่ได้

  • ได้เร็วขึ้นในเวลาทำงาน


สมบูรณ์แบบ ... คาดว่าจะได้คำตอบในประเด็น ทำได้ดีมาก :)
Kunal Gupta

37

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

โดยทั่วไปแล้ววิธีการของ DOM นั้นใช้สำหรับโครงสร้าง XML ขนาดเล็ก (ซึ่งขนาดเล็กขึ้นอยู่กับจำนวนแรงม้าและหน่วยความจำที่แพลตฟอร์มของคุณมี) ซึ่งอาจต้องแก้ไขและสอบถามในรูปแบบที่แตกต่างกันเมื่อทำการโหลดแล้ว

ในทางกลับกัน SAX ถูกออกแบบมาเพื่อจัดการอินพุต XML ของแทบทุกขนาด แทนที่จะเป็นเฟรมเวิร์ก XML ที่ทำงานอย่างหนักเพื่อคุณในการหาโครงสร้างของเอกสารและการจัดเตรียมวัตถุจำนวนมากสำหรับโหนดคุณลักษณะทั้งหมดเป็นต้น SAX จะปล่อยสิ่งนั้นให้คุณ

สิ่งที่มันทำคืออ่านอินพุตจากด้านบนและเรียกวิธีการโทรกลับที่คุณให้ไว้เมื่อมี "เหตุการณ์" เกิดขึ้น เหตุการณ์อาจกดแท็กเปิด, แอตทริบิวต์ในแท็ก, ค้นหาข้อความภายในองค์ประกอบหรือเจอแท็กปิดท้าย

แซ็กโซโฟนจะอ่านอินพุตอย่างดื้อรั้นและบอกสิ่งที่เห็นในแบบนี้ มันขึ้นอยู่กับคุณที่จะรักษาข้อมูลสถานะทั้งหมดที่คุณต้องการ โดยปกติแล้วนี่หมายความว่าคุณจะสร้างสถานะของเครื่องจักร

ในขณะที่วิธีการในการประมวลผล XML นี้น่าเบื่อกว่ามาก แต่ก็มีประสิทธิภาพมากเช่นกัน ลองนึกภาพคุณต้องการเพียงดึงชื่อของบทความข่าวจากฟีดบล็อก หากคุณอ่าน XML นี้โดยใช้ DOM มันจะโหลดเนื้อหาบทความทั้งหมดรูปภาพทั้งหมดที่อยู่ใน XML ลงในหน่วยความจำแม้ว่าคุณจะไม่สนใจก็ตาม

ด้วย SAX คุณสามารถตรวจสอบว่าชื่อองค์ประกอบเป็น (เช่น) "ชื่อ" ทุกครั้งที่มีการเรียกใช้เมธอดเหตุการณ์ "startTag" ของคุณหรือไม่ ถ้าเป็นเช่นนั้นคุณรู้ว่าคุณจำเป็นต้องเพิ่มเหตุการณ์ "elementText" ถัดไปที่มีให้คุณ เมื่อคุณได้รับการเรียกเหตุการณ์ "endTag" คุณจะตรวจสอบอีกครั้งว่านี่เป็นองค์ประกอบปิดของ "ชื่อ" หรือไม่ หลังจากนั้นคุณเพียง แต่ไม่สนใจองค์ประกอบเพิ่มเติมทั้งหมดจนกระทั่งอินพุตสิ้นสุดหรือ "startTag" อื่นที่มีชื่อ "title" ปรากฏขึ้นมา และอื่น ๆ ...

คุณสามารถอ่านผ่านเมกะไบต์และเมกะไบต์ของ XML ด้วยวิธีนี้เพียงดึงข้อมูลจำนวนเล็กน้อยที่คุณต้องการ

ด้านลบของวิธีการนี้แน่นอนว่าคุณต้องทำหนังสือมากขึ้นด้วยตัวเองขึ้นอยู่กับข้อมูลที่คุณต้องการแยกและความซับซ้อนของโครงสร้าง XML นอกจากนี้คุณไม่สามารถปรับเปลี่ยนโครงสร้างของต้นไม้ XML ได้เนื่องจากคุณไม่เคยมีมันอยู่ในมือทั้งหมด

ดังนั้นโดยทั่วไป SAX เหมาะสำหรับการรวบรวมข้อมูลจำนวนมากที่คุณอาจได้รับด้วยคำค้นหา "เฉพาะ" แต่ไม่จำเป็นต้องแก้ไขในขณะที่ DOM มุ่งให้ความยืดหยุ่นในการเปลี่ยนโครงสร้างและเนื้อหาโดยมีค่าใช้จ่ายเพิ่มเติม ของความต้องการทรัพยากรที่สูงขึ้น


16

คุณกำลังเปรียบเทียบแอปเปิ้ลและลูกแพร์ SAX เป็นตัวแยกวิเคราะห์ที่แยกวิเคราะห์โครงสร้าง DOM แบบต่อเนื่อง มีการแยกวิเคราะห์จำนวนมากและ "อ้างอิงจากเหตุการณ์" หมายถึงวิธีการแยกวิเคราะห์

อาจมีการสรุปขนาดเล็กตามลำดับ:

  • ด็อม (DOM) เป็นรูปแบบข้อมูลที่เป็นนามธรรมที่อธิบายลำดับชั้นโครงสร้างเอกสารต้นไม้ตาม; แผนผังเอกสารประกอบด้วยโหนดคือองค์ประกอบแอตทริบิวต์และโหนดข้อความ (และอื่น ๆ ) โหนดมีผู้ปกครองพี่น้องและเด็ก ๆ และสามารถข้ามผ่านได้ ฯลฯ ทุกสิ่งที่คุณคุ้นเคยจากการทำ JavaScript (ซึ่งบังเอิญไม่มีส่วนเกี่ยวข้องกับ DOM)

  • โครงสร้าง DOM อาจต่อเนื่องกันเช่นเขียนไปยังไฟล์โดยใช้ภาษามาร์กอัปเช่น HTML หรือ XML ดังนั้นไฟล์ HTML หรือ XML จะมีเวอร์ชันเอกสาร "ตัดออก" หรือ "แบนออก"

  • สำหรับคอมพิวเตอร์ที่จะจัดการหรือแม้แต่แสดงต้นไม้ DOM จากไฟล์มันจะต้องทำการดีซีเรียลไลซ์หรือแยกวิเคราะห์ไฟล์และสร้างต้นไม้นามธรรมใหม่ในหน่วยความจำ นี่คือที่มาในการแยกวิเคราะห์

ตอนนี้เรามาถึงลักษณะของ parsers วิธีหนึ่งในการแยกวิเคราะห์คือการอ่านในเอกสารทั้งหมดและสร้างโครงสร้างทรีในหน่วยความจำแบบวนซ้ำและในที่สุดก็เปิดเผยผลลัพธ์ทั้งหมดให้กับผู้ใช้ (ฉันคิดว่าคุณสามารถเรียก parsers เหล่านี้ "parsers DOM".) ที่จะมีประโยชน์มากสำหรับผู้ใช้ (ฉันคิดว่านั่นคือสิ่งที่ parser XML ของ PHP ทำ) แต่มันทนทุกข์ทรมานจากปัญหาการขยายขนาดและมีราคาแพงมากสำหรับเอกสารขนาดใหญ่

ในทางกลับกันการแยกวิเคราะห์เหตุการณ์ตาม SAX จะดูไฟล์เป็นเส้นตรงและเพียงแค่ทำการโทรกลับไปหาผู้ใช้ทุกครั้งที่พบชิ้นส่วนโครงสร้างเช่น "องค์ประกอบนี้เริ่มต้น" "องค์ประกอบนั้นสิ้นสุด" , "ข้อความบางส่วนที่นี่" ฯลฯ มีประโยชน์ที่มันสามารถดำเนินต่อไปได้ตลอดไปโดยไม่ต้องกังวลเกี่ยวกับขนาดไฟล์อินพุต แต่มันมีระดับต่ำกว่ามากเพราะผู้ใช้ต้องการทำงานการประมวลผลจริงทั้งหมด (โดยการจัดเตรียม หลังเรียกร้อง) หากต้องการกลับไปที่คำถามเดิมของคุณคำว่า "อิงตามเหตุการณ์" หมายถึงเหตุการณ์การแยกวิเคราะห์ที่ตัวแยกวิเคราะห์ยกขึ้นขณะที่สำรวจไฟล์ XML

บทความวิกิพีเดียมีรายละเอียดจำนวนมากในขั้นตอนของการแยกแซ็กโซโฟน


11

ฉันจะตอบคำถามทั่วไปเกี่ยวกับคำถามนี้:

ตอบคำถาม

ทำไมเราต้องมีโปรแกรมแยกวิเคราะห์ XML?

เราต้องการตัวแยกวิเคราะห์ XML เพราะเราไม่ต้องการทำทุกอย่างในแอปพลิเคชันของเราและเราต้องการโปรแกรมหรือไลบรารี "ผู้ช่วยเหลือ" บางอย่างที่จะทำสิ่งที่ต่ำมาก แต่จำเป็นสำหรับเรามาก สิ่งที่จำเป็นในระดับต่ำ แต่จำเป็นเหล่านี้รวมถึงการตรวจสอบรูปแบบที่ดีตรวจสอบเอกสารกับ DTD หรือสคีมา (เพียงเพื่อตรวจสอบตัวแยกวิเคราะห์) การแก้ไขการอ้างอิงอักขระการทำความเข้าใจส่วน CDATA และอื่น ๆ ตัวแยกวิเคราะห์ XML เป็นเพียงโปรแกรม "ตัวช่วย" ดังกล่าวและพวกเขาจะทำงานเหล่านี้ทั้งหมด ด้วยตัวแยกวิเคราะห์ XML เราได้รับการปกป้องจากความซับซ้อนเหล่านี้จำนวนมากและเราสามารถตั้งสมาธิกับตัวเองในการเขียนโปรแกรมระดับสูงผ่าน API ที่ใช้งานโดยตัวแยกวิเคราะห์ซึ่งทำให้ประสิทธิภาพการเขียนโปรแกรมดีขึ้น

อันไหนดีกว่า SAX หรือ DOM

ตัวแยกวิเคราะห์ SAX และ DOM มีข้อดีและข้อเสีย ตัวเลือกใดดีกว่าควรขึ้นอยู่กับคุณสมบัติของใบสมัครของคุณ (โปรดดูคำถามด้านล่าง)

เครื่องมือแยกวิเคราะห์ตัวใดที่สามารถรับความเร็วได้ดีกว่าตัวแยกวิเคราะห์ DOM หรือ SAX

ตัวแยกวิเคราะห์ SAX สามารถรับความเร็วที่ดีขึ้นได้

ข้อแตกต่างระหว่าง API แบบอิงทรีและ API แบบอิงเหตุการณ์คืออะไร

Tree-based API นั้นมีศูนย์กลางอยู่ที่โครงสร้างของต้นไม้ดังนั้นจึงมีส่วนต่อประสานกับส่วนประกอบของแผนผัง (ซึ่งเป็นเอกสาร DOM) เช่นส่วนต่อประสานเอกสาร, ส่วนต่อประสานโหนด, ส่วนต่อประสาน NodeList, ส่วนต่อประสานองค์ประกอบ, ส่วนต่อประสาน Attr เป็นต้น อย่างไรก็ตามโดยคมชัด API ตามเหตุการณ์จะมีส่วนต่อประสานบนตัวจัดการ มีอินเตอร์เฟสตัวจัดการสี่อินเตอร์เฟส, ContentHandler อินเตอร์เฟส, อินเตอร์เฟส DTDHandler, อินเตอร์เฟส EntityResolver และอินเตอร์เฟส ErrorHandler

อะไรคือความแตกต่างระหว่าง DOM Parser และ SAX Parser

ตัวแยกวิเคราะห์ DOM และตัวแยกวิเคราะห์ SAX ทำงานได้หลายวิธี:

  • ตัวแยกวิเคราะห์ DOM สร้างโครงสร้างแบบต้นไม้ในหน่วยความจำจากเอกสารอินพุตแล้วรอการร้องขอจากไคลเอนต์ แต่ตัวแยกวิเคราะห์ SAX ไม่ได้สร้างโครงสร้างภายในใด ๆ แต่จะเกิดขึ้นของส่วนประกอบของเอกสารอินพุตเป็นเหตุการณ์และบอกลูกค้าว่ามันอ่านอะไรเมื่ออ่านผ่านเอกสารอินพุต

  • ตัวแยกวิเคราะห์ DOM ให้บริการแอปพลิเคชันไคลเอนต์พร้อมเอกสารทั้งหมดเสมอไม่ว่าลูกค้าจะต้องการจำนวนเท่าใด แต่ตัวแยกวิเคราะห์ SAX ให้บริการแอปพลิเคชันไคลเอนต์เสมอกับชิ้นส่วนของเอกสารในเวลาที่กำหนด

  • ด้วย DOM parser การเรียกใช้เมธอดในแอปพลิเคชันไคลเอนต์จะต้องชัดเจนและก่อให้เกิดสายโซ่ แต่ด้วย SAX วิธีการบางอย่าง (โดยปกติจะอยู่เหนือ cient) จะถูกเรียกใช้โดยอัตโนมัติ (โดยนัย) ในวิธีที่เรียกว่า "การโทรกลับ" เมื่อมีเหตุการณ์บางอย่างเกิดขึ้น วิธีการเหล่านี้ไม่จำเป็นต้องเรียกลูกค้าอย่างชัดเจนถึงแม้ว่าเราจะสามารถเรียกพวกเขาอย่างชัดเจน

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

ตัวแยกวิเคราะห์ที่ดีควรเป็นไปอย่างรวดเร็ว (ประหยัดเวลา) มีประสิทธิภาพของพื้นที่มีฟังก์ชันการใช้งานที่หลากหลายและใช้งานง่าย แต่ในความเป็นจริงไม่มีตัวแยกวิเคราะห์หลักใดที่มีคุณสมบัติเหล่านี้ทั้งหมดในเวลาเดียวกัน ตัวอย่างเช่น DOM Parser อุดมไปด้วยฟังก์ชันการทำงาน (เพราะมันสร้างต้นไม้ DOM ในหน่วยความจำและช่วยให้คุณสามารถเข้าถึงส่วนใด ๆ ของเอกสารซ้ำ ๆ และช่วยให้คุณสามารถปรับเปลี่ยนต้นไม้ DOM) แต่มันเป็นพื้นที่ที่ไม่มีประสิทธิภาพเมื่อเอกสารมีขนาดใหญ่ และใช้เวลานานหน่อยในการเรียนรู้วิธีทำงานกับมัน อย่างไรก็ตาม SAX Parser มีพื้นที่ว่างที่มีประสิทธิภาพมากขึ้นในกรณีของเอกสารอินพุตขนาดใหญ่ (เพราะไม่มีโครงสร้างภายใน) ยิ่งไปกว่านั้นทำงานได้เร็วกว่าและเรียนรู้ได้ง่ายกว่า DOM Parser เนื่องจาก API นั้นง่ายมาก แต่จากมุมมองการทำงาน มันให้ฟังก์ชั่นน้อยลงซึ่งหมายความว่าผู้ใช้เองจะต้องดูแลมากขึ้นเช่นการสร้างโครงสร้างข้อมูลของตัวเอง โดยวิธีการแยกวิเคราะห์ที่ดีคืออะไร? ฉันคิดว่าคำตอบนั้นขึ้นอยู่กับลักษณะของการสมัครของคุณ

แอปพลิเคชันในโลกแห่งความจริงอะไรบ้างที่ใช้ SAX parser มีข้อดีกว่าการใช้ DOM parser และในทางกลับกัน แอปพลิเคชันทั่วไปสำหรับ DOM parser และ SAX parser คืออะไร

ในกรณีต่อไปนี้การใช้ตัวแยกวิเคราะห์ SAX มีข้อดีกว่าการใช้ตัวแยกวิเคราะห์ DOM

  • เอกสารที่ป้อนมีขนาดใหญ่เกินไปสำหรับหน่วยความจำที่มีอยู่ (จริง ๆ แล้วในกรณีนี้ SAX เป็นตัวเลือกเดียวของคุณ)
  • คุณสามารถประมวลผลเอกสารเป็นชิ้นเล็ก ๆ ที่ต่อเนื่องกันได้ คุณไม่จำเป็นต้องใช้เอกสารทั้งหมดก่อนจึงจะสามารถทำงานที่เป็นประโยชน์ได้
  • คุณเพียงแค่ต้องการใช้ parser เพื่อดึงข้อมูลที่น่าสนใจและการคำนวณทั้งหมดของคุณจะขึ้นอยู่กับโครงสร้างข้อมูลที่สร้างขึ้นด้วยตัวเอง ที่จริงแล้วในแอปพลิเคชั่นส่วนใหญ่ของเราเราสร้างโครงสร้างข้อมูลของเราเองซึ่งโดยปกติแล้วจะไม่ซับซ้อนเท่ากับทรี DOM จากความหมายนี้ฉันคิดว่าโอกาสในการใช้ DOM parser น้อยกว่าการใช้ SAX parser

ในกรณีต่อไปนี้การใช้ตัวแยกวิเคราะห์ DOM มีข้อดีกว่าการใช้ตัวแยกวิเคราะห์ SAX

  • แอปพลิเคชันของคุณจำเป็นต้องเข้าถึงส่วนต่าง ๆ ของเอกสารในเวลาเดียวกัน
  • แอปพลิเคชันของคุณอาจใช้โครงสร้างข้อมูลภายในซึ่งมีความซับซ้อนเกือบเท่ากับเอกสาร
  • แอปพลิเคชันของคุณต้องแก้ไขเอกสารซ้ำ ๆ
  • แอปพลิเคชันของคุณต้องเก็บเอกสารไว้เป็นระยะเวลานานโดยใช้วิธีการโทรหลายวิธี

ตัวอย่าง (ใช้ parser DOM หรือ SAX parser หรือไม่):

สมมติว่าผู้สอนมีเอกสาร XML ที่มีข้อมูลส่วนบุคคลทั้งหมดของนักเรียนรวมถึงคะแนนที่นักเรียนทำในชั้นเรียนและตอนนี้เขากำลังกำหนดเกรดสุดท้ายสำหรับนักเรียนโดยใช้แอปพลิเคชัน สิ่งที่เขาต้องการผลิตคือรายการที่มี SSN และผลการเรียน นอกจากนี้เราคิดว่าในใบสมัครของเขาผู้สอนไม่ใช้โครงสร้างข้อมูลเช่นอาร์เรย์เพื่อจัดเก็บข้อมูลส่วนบุคคลของนักเรียนและคะแนน หากผู้สอนตัดสินใจที่จะให้ A แก่ผู้ที่ได้รับค่าเฉลี่ยของชั้นเรียนหรือสูงกว่าและให้ B แก่ผู้อื่นดังนั้นเขาควรใช้โปรแกรมแยกวิเคราะห์ DOM ในใบสมัครของเขา เหตุผลก็คือเขาไม่มีทางที่จะรู้ว่าค่าเฉลี่ยของระดับชั้นก่อนที่เอกสารทั้งหมดจะได้รับการประมวลผล สิ่งที่เขาอาจต้องทำในใบสมัครของเขาคือสิ่งแรกที่ต้องพิจารณานักเรียนทุกคน ทำคะแนนและคำนวณค่าเฉลี่ยแล้วดูเอกสารอีกครั้งและกำหนดเกรดสุดท้ายให้นักเรียนแต่ละคนโดยเปรียบเทียบคะแนนที่เขาได้รับกับค่าเฉลี่ยของชั้นเรียน อย่างไรก็ตามหากผู้สอนใช้นโยบายการให้เกรดเช่นว่านักเรียนที่ได้ 90 คะแนนขึ้นไปจะได้รับมอบหมาย A และคนอื่น ๆ จะได้รับมอบหมายจาก B ดังนั้นเขาน่าจะใช้ SAX parser ดีกว่า เหตุผลคือเพื่อให้นักเรียนแต่ละคนได้เกรดสุดท้ายเขาไม่จำเป็นต้องรอให้เอกสารทั้งหมดถูกประมวลผล เขาสามารถกำหนดเกรดให้กับนักเรียนได้ทันทีที่ตัวแยกวิเคราะห์ SAX อ่านเกรดของนักเรียนคนนี้ ในการวิเคราะห์ข้างต้นเราคิดว่าผู้สอนไม่ได้สร้างโครงสร้างข้อมูลของตนเอง ถ้าเขาสร้างโครงสร้างข้อมูลของตัวเองเช่นอาร์เรย์ของสตริงเพื่อเก็บ SSN และอาร์เรย์ของจำนวนเต็มเพื่อเก็บคะแนน ในกรณีนี้, ฉันคิดว่า SAX เป็นตัวเลือกที่ดีกว่าก่อนหน้านี้สามารถประหยัดทั้งหน่วยความจำและเวลาได้ดี แต่ยังทำงานให้เสร็จ อีกหนึ่งข้อพิจารณาในตัวอย่างนี้ จะทำอย่างไรถ้าสิ่งที่ผู้สอนต้องการทำคือไม่พิมพ์รายการ แต่เพื่อบันทึกเอกสารต้นฉบับกลับมาพร้อมกับเกรดของนักเรียนแต่ละคนที่อัพเดต ในกรณีนี้ตัวแยกวิเคราะห์ DOM ควรเป็นตัวเลือกที่ดีกว่าไม่ว่าจะใช้นโยบายการให้คะแนนแบบใด เขาไม่จำเป็นต้องสร้างโครงสร้างข้อมูลใด ๆ ของเขาเอง สิ่งที่เขาต้องทำคือการแก้ไขทรี DOM แรก (เช่นตั้งค่าเป็นโหนด 'เกรด') จากนั้นบันทึกทรีที่ถูกปรับเปลี่ยนทั้งหมด หากเขาเลือกที่จะใช้ตัวแยกวิเคราะห์ SAX แทนที่จะเป็นตัวแยกวิเคราะห์ DOM ในกรณีนี้เขาต้องสร้างโครงสร้างข้อมูลที่ซับซ้อนเกือบเท่ากับทรี DOM ก่อนที่เขาจะสามารถทำงานให้เสร็จได้ แต่ทำงานให้เสร็จลุล่วง อีกหนึ่งข้อพิจารณาในตัวอย่างนี้ จะทำอย่างไรถ้าสิ่งที่ผู้สอนต้องการทำคือไม่พิมพ์รายการ แต่เพื่อบันทึกเอกสารต้นฉบับกลับมาพร้อมกับเกรดของนักเรียนแต่ละคนที่อัพเดต ในกรณีนี้ตัวแยกวิเคราะห์ DOM ควรเป็นตัวเลือกที่ดีกว่าไม่ว่าจะใช้นโยบายการให้คะแนนแบบใด เขาไม่จำเป็นต้องสร้างโครงสร้างข้อมูลใด ๆ ของเขาเอง สิ่งที่เขาต้องทำคือการแก้ไขทรี DOM แรก (เช่นตั้งค่าเป็นโหนด 'เกรด') จากนั้นบันทึกทรีที่ถูกปรับเปลี่ยนทั้งหมด หากเขาเลือกที่จะใช้ตัวแยกวิเคราะห์ SAX แทนที่จะเป็นตัวแยกวิเคราะห์ DOM ในกรณีนี้เขาต้องสร้างโครงสร้างข้อมูลที่ซับซ้อนเกือบเท่ากับทรี DOM ก่อนที่เขาจะสามารถทำงานให้เสร็จได้ แต่ทำงานให้เสร็จลุล่วง อีกหนึ่งข้อพิจารณาในตัวอย่างนี้ จะทำอย่างไรถ้าสิ่งที่ผู้สอนต้องการทำคือไม่พิมพ์รายการ แต่เพื่อบันทึกเอกสารต้นฉบับกลับมาพร้อมกับเกรดของนักเรียนแต่ละคนที่อัพเดต ในกรณีนี้ตัวแยกวิเคราะห์ DOM ควรเป็นตัวเลือกที่ดีกว่าไม่ว่าจะใช้นโยบายการให้คะแนนแบบใด เขาไม่จำเป็นต้องสร้างโครงสร้างข้อมูลใด ๆ ของเขาเอง สิ่งที่เขาต้องทำคือการแก้ไขทรี DOM แรก (เช่นตั้งค่าเป็นโหนด 'เกรด') จากนั้นบันทึกทรีที่ถูกปรับเปลี่ยนทั้งหมด หากเขาเลือกที่จะใช้ตัวแยกวิเคราะห์ SAX แทนที่จะเป็นตัวแยกวิเคราะห์ DOM ในกรณีนี้เขาต้องสร้างโครงสร้างข้อมูลซึ่งมีความซับซ้อนเหมือนต้นไม้ DOM ก่อนที่เขาจะสามารถทำงานให้เสร็จได้ แต่เพื่อบันทึกเอกสารต้นฉบับกลับมาพร้อมกับเกรดของนักเรียนแต่ละคนที่อัพเดตแล้ว? ในกรณีนี้ตัวแยกวิเคราะห์ DOM ควรเป็นตัวเลือกที่ดีกว่าไม่ว่าจะใช้นโยบายการให้คะแนนแบบใดก็ตาม เขาไม่จำเป็นต้องสร้างโครงสร้างข้อมูลใด ๆ ของเขาเอง สิ่งที่เขาต้องทำคือการแก้ไขทรี DOM แรก (เช่นตั้งค่าเป็นโหนด 'เกรด') จากนั้นบันทึกทรีที่ถูกปรับเปลี่ยนทั้งหมด หากเขาเลือกที่จะใช้ตัวแยกวิเคราะห์ SAX แทนที่จะเป็นตัวแยกวิเคราะห์ DOM ในกรณีนี้เขาต้องสร้างโครงสร้างข้อมูลซึ่งมีความซับซ้อนเหมือนต้นไม้ DOM ก่อนที่เขาจะสามารถทำงานให้เสร็จได้ แต่เพื่อบันทึกเอกสารต้นฉบับกลับมาพร้อมกับเกรดของนักเรียนแต่ละคนที่อัพเดตแล้ว? ในกรณีนี้ตัวแยกวิเคราะห์ DOM ควรเป็นตัวเลือกที่ดีกว่าไม่ว่าจะใช้นโยบายการให้คะแนนแบบใดก็ตาม เขาไม่จำเป็นต้องสร้างโครงสร้างข้อมูลใด ๆ ของเขาเอง สิ่งที่เขาต้องทำคือการแก้ไขทรี DOM แรก (เช่นตั้งค่าเป็นโหนด 'เกรด') จากนั้นบันทึกทรีที่ถูกปรับเปลี่ยนทั้งหมด หากเขาเลือกที่จะใช้ตัวแยกวิเคราะห์ SAX แทนที่จะเป็นตัวแยกวิเคราะห์ DOM ในกรณีนี้เขาต้องสร้างโครงสร้างข้อมูลซึ่งมีความซับซ้อนเหมือนต้นไม้ DOM ก่อนที่เขาจะสามารถทำงานให้เสร็จได้ โหนด) จากนั้นให้บันทึกแผนผังที่ถูกแก้ไขทั้งหมด หากเขาเลือกที่จะใช้ตัวแยกวิเคราะห์ SAX แทนที่จะเป็นตัวแยกวิเคราะห์ DOM ในกรณีนี้เขาต้องสร้างโครงสร้างข้อมูลซึ่งมีความซับซ้อนเหมือนต้นไม้ DOM ก่อนที่เขาจะสามารถทำงานให้เสร็จได้ โหนด) จากนั้นให้บันทึกแผนผังที่ถูกแก้ไขทั้งหมด หากเขาเลือกที่จะใช้ตัวแยกวิเคราะห์ SAX แทนที่จะเป็นตัวแยกวิเคราะห์ DOM ในกรณีนี้เขาต้องสร้างโครงสร้างข้อมูลซึ่งมีความซับซ้อนเหมือนต้นไม้ DOM ก่อนที่เขาจะสามารถทำงานให้เสร็จได้

ตัวอย่าง

คำแถลงปัญหา : เขียนโปรแกรม Java เพื่อดึงข้อมูลทั้งหมดเกี่ยวกับวงกลมซึ่งเป็นองค์ประกอบในเอกสาร XML ที่กำหนด เราสมมติว่าองค์ประกอบวงกลมแต่ละวงมีองค์ประกอบย่อยสามองค์ประกอบ (เช่น x, y และรัศมี) รวมถึงแอตทริบิวต์สี ตัวอย่างเอกสารได้รับด้านล่าง:

<?xml version="1.0"?> 
<!DOCTYPE shapes [
<!ELEMENT shapes (circle)*>
<!ELEMENT circle (x,y,radius)>
<!ELEMENT x (#PCDATA)>
<!ELEMENT y (#PCDATA)>
<!ELEMENT radius (#PCDATA)>
<!ATTLIST circle color CDATA #IMPLIED>
]>

<shapes> 
          <circle color="BLUE"> 
                <x>20</x>
                <y>20</y>
                <radius>20</radius> 
          </circle>
          <circle color="RED" >
                <x>40</x>
                <y>40</y>
                <radius>20</radius> 
          </circle>
</shapes> 

โปรแกรมกับ DOMparser

import java.io.*;
import org.w3c.dom.*;
import org.apache.xerces.parsers.DOMParser;


public class shapes_DOM {
   static int numberOfCircles = 0;   // total number of circles seen
   static int x[] = new int[1000];   // X-coordinates of the centers
   static int y[] = new int[1000];   // Y-coordinates of the centers  
   static int r[] = new int[1000];   // radius of the circle
   static String color[] = new String[1000];  // colors of the circles 

   public static void main(String[] args) {   

      try{
         // create a DOMParser
         DOMParser parser=new DOMParser();
         parser.parse(args[0]);

         // get the DOM Document object
         Document doc=parser.getDocument();

         // get all the circle nodes
         NodeList nodelist = doc.getElementsByTagName("circle");
         numberOfCircles =  nodelist.getLength();

         // retrieve all info about the circles
         for(int i=0; i<nodelist.getLength(); i++) {

            // get one circle node
            Node node = nodelist.item(i);

            // get the color attribute 
            NamedNodeMap attrs = node.getAttributes();
            if(attrs.getLength() > 0)
               color[i]=(String)attrs.getNamedItem("color").getNodeValue();

            // get the child nodes of a circle node 
            NodeList childnodelist = node.getChildNodes();

            // get the x and y value 
            for(int j=0; j<childnodelist.getLength(); j++) {
               Node childnode = childnodelist.item(j);
               Node textnode = childnode.getFirstChild();//the only text node
               String childnodename=childnode.getNodeName(); 
               if(childnodename.equals("x")) 
                  x[i]= Integer.parseInt(textnode.getNodeValue().trim());
               else if(childnodename.equals("y")) 
                  y[i]= Integer.parseInt(textnode.getNodeValue().trim());
               else if(childnodename.equals("radius")) 
                  r[i]= Integer.parseInt(textnode.getNodeValue().trim());
            }

         }

         // print the result
         System.out.println("circles="+numberOfCircles);
         for(int i=0;i<numberOfCircles;i++) {
             String line="";
             line=line+"(x="+x[i]+",y="+y[i]+",r="+r[i]+",color="+color[i]+")";
             System.out.println(line);
         }

      }  catch (Exception e) {e.printStackTrace(System.err);}

    }

}

โปรแกรมกับ SAXparser

import java.io.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import org.apache.xerces.parsers.SAXParser;


public class shapes_SAX extends DefaultHandler {

   static int numberOfCircles = 0;   // total number of circles seen
   static int x[] = new int[1000];   // X-coordinates of the centers
   static int y[] = new int[1000];   // Y-coordinates of the centers
   static int r[] = new int[1000];   // radius of the circle
   static String color[] = new String[1000];  // colors of the circles

   static int flagX=0;    //to remember what element has occurred
   static int flagY=0;    //to remember what element has occurred
   static int flagR=0;    //to remember what element has occurred

   // main method 
   public static void main(String[] args) {   
      try{
         shapes_SAX SAXHandler = new shapes_SAX (); // an instance of this class
         SAXParser parser=new SAXParser();          // create a SAXParser object 
         parser.setContentHandler(SAXHandler);      // register with the ContentHandler 
         parser.parse(args[0]);
      }  catch (Exception e) {e.printStackTrace(System.err);}  // catch exeptions
   }

   // override the startElement() method
   public void startElement(String uri, String localName, 
                       String rawName, Attributes attributes) {
         if(rawName.equals("circle"))                      // if a circle element is seen
            color[numberOfCircles]=attributes.getValue("color");  // get the color attribute 

         else if(rawName.equals("x"))      // if a x element is seen set the flag as 1 
            flagX=1;
         else if(rawName.equals("y"))      // if a y element is seen set the flag as 2
            flagY=1;
         else if(rawName.equals("radius")) // if a radius element is seen set the flag as 3 
            flagR=1;
   }

   // override the endElement() method
   public void endElement(String uri, String localName, String rawName) {
         // in this example we do not need to do anything else here
         if(rawName.equals("circle"))                       // if a circle element is ended 
            numberOfCircles +=  1;                          // increment the counter 
   }

   // override the characters() method
   public void characters(char characters[], int start, int length) {
         String characterData = 
             (new String(characters,start,length)).trim(); // get the text

         if(flagX==1) {        // indicate this text is for <x> element 
             x[numberOfCircles] = Integer.parseInt(characterData);
             flagX=0;
         }
         else if(flagY==1) {  // indicate this text is for <y> element 
             y[numberOfCircles] = Integer.parseInt(characterData);
             flagY=0;
         }
         else if(flagR==1) {  // indicate this text is for <radius> element 
             r[numberOfCircles] = Integer.parseInt(characterData);
             flagR=0;
         }
   }

   // override the endDocument() method
   public void endDocument() {
         // when the end of document is seen, just print the circle info 
         System.out.println("circles="+numberOfCircles);
         for(int i=0;i<numberOfCircles;i++) {
             String line="";
             line=line+"(x="+x[i]+",y="+y[i]+",r="+r[i]+",color="+color[i]+")";
             System.out.println(line);
         }
   }


}

6

ในทางปฏิบัติ: book.xml

<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
</bookstore>
  • DOM แสดงเอกสาร xml เป็นโครงสร้างแบบต้นไม้ต่อไปนี้ในหน่วยความจำ
  • DOM คือ W3C มาตรฐาน
  • เครื่องมือแยกวิเคราะห์ DOM ทำงานกับ Document Object Model
  • DOM ใช้หน่วยความจำเพิ่มขึ้นเหมาะสำหรับเอกสาร XML ขนาดเล็ก
  • DOM นั้นใช้งานง่ายไปข้างหน้าหรือข้างหลัง

ป้อนคำอธิบายรูปภาพที่นี่


  • แซ็กโซโฟนที่มีการจัดเอกสาร XML เป็นตามเหตุการณ์เช่น,start element:abcend element:abc
  • SAX ไม่ใช่มาตรฐาน W3C มันถูกพัฒนาโดยกลุ่มนักพัฒนา
  • SAX ไม่ใช้หน่วยความจำเหมาะสำหรับเอกสาร XML ขนาดใหญ่
  • การนำทางย้อนกลับไม่สามารถทำได้เนื่องจากดำเนินการตามลำดับเอกสาร
  • เหตุการณ์เกิดขึ้นกับโหนด / องค์ประกอบและให้โหนดย่อยทั้งหมด (Latin nodus, 'knot')

เอกสาร XML นี้เมื่อส่งผ่านตัวแยกวิเคราะห์ SAX จะสร้างลำดับของเหตุการณ์ดังต่อไปนี้ :

start element: bookstore
start element: book with an attribute category equal to cooking
start element: title with an attribute lang equal to en
Text node, with data equal to Everyday Italian
....
end element: title
.....
end element: book
end element: bookstore

เหตุใดอยู่attr: "lang"เหนือelement: <title>การแสดงภาพของการแยก DOM มองไปที่ XML มันดูเหมือนว่าattrควรจะขนานไปกับมัน<element>เช่นเดียวกับและ<book> categoryนั่นเป็นเพียงเทคนิคการประหยัดพื้นที่หรือมีความสัมพันธ์กับผู้ปกครองเด็กหรือไม่?
1252748

มันเป็นเพียงเทคนิคการประหยัดพื้นที่
Premraj

3

DOM ย่อมาจาก Document Object Model และเป็นตัวแทนของเอกสาร XML ในรูปแบบของต้นไม้ซึ่งองค์ประกอบแต่ละตัวเป็นตัวแทนของกิ่งไม้ต้นไม้ DOM Parser สร้างการแทนต้นไม้ในหน่วยความจำของไฟล์ XML แล้วแยกวิเคราะห์มันดังนั้นจึงต้องใช้หน่วยความจำเพิ่มเติมและแนะนำให้มีขนาดฮีพที่เพิ่มขึ้นสำหรับ DOM parser เพื่อหลีกเลี่ยงพื้นที่ Java.lang.OutOfMemoryError: java การแยกไฟล์ XML โดยใช้ DOM parser ค่อนข้างเร็วหากไฟล์ XML มีขนาดเล็ก แต่ถ้าคุณลองอ่านไฟล์ XML ขนาดใหญ่ที่ใช้ DOM parser มีโอกาสมากกว่าที่จะใช้เวลานานหรืออาจไม่สามารถโหลดได้อย่างสมบูรณ์เพราะ มันต้องใช้หน่วยความจำจำนวนมากเพื่อสร้าง XML Dom Tree Java ให้การสนับสนุน DOM Parsing และคุณสามารถแยกวิเคราะห์ไฟล์ XML ใน Java โดยใช้ DOM parser คลาส DOM อยู่ในแพ็คเกจ w3c.dom ในขณะที่ DOM Parser สำหรับ Java อยู่ในแพคเกจ JAXP (Java API สำหรับการแยกวิเคราะห์ XML)

SAX XML Parser ใน Java

SAX ย่อมาจาก Simple API สำหรับการแยกวิเคราะห์ XML นี่คือการแยกวิเคราะห์ XML ตามเหตุการณ์และแยกวิเคราะห์ไฟล์ XML ทีละขั้นตอนเหมาะสำหรับไฟล์ XML ขนาดใหญ่ SAX XML Parser fires เหตุการณ์เมื่อพบแท็กเปิดองค์ประกอบหรือแอตทริบิวต์และการแยกวิเคราะห์ทำงานตามนั้น ขอแนะนำให้ใช้ตัวแยกวิเคราะห์ SAX XML สำหรับการแยกวิเคราะห์ไฟล์ xml ขนาดใหญ่ใน Java เพราะไม่จำเป็นต้องโหลดไฟล์ XML ทั้งหมดใน Java และสามารถอ่านไฟล์ XML ขนาดใหญ่ในส่วนเล็ก ๆ Java ให้การสนับสนุนตัวแยกวิเคราะห์ SAX และคุณสามารถแยกวิเคราะห์ไฟล์ xml ใด ๆ ใน Java โดยใช้ SAX Parser ฉันได้กล่าวถึงตัวอย่างของการอ่านไฟล์ xml โดยใช้ SAX Parser ที่นี่ ข้อเสียอย่างหนึ่งของการใช้ SAX Parser ใน java คือการอ่านไฟล์ XML ใน Java โดยใช้ SAX Parser ต้องการรหัสเพิ่มเติมในการเปรียบเทียบ DOM Parser

ความแตกต่างระหว่าง DOM และ SAX XML Parser

นี่คือความแตกต่างระดับสูงเล็กน้อยระหว่าง DOM parser และ SAX Parser ใน Java:

1) DOM parser โหลดเอกสาร xml ทั้งหมดในหน่วยความจำในขณะที่ SAX โหลดเฉพาะส่วนเล็ก ๆ ของไฟล์ XML ในหน่วยความจำ

2) DOM parser เร็วกว่า SAX เพราะเข้าถึงเอกสาร XML ทั้งหมดในหน่วยความจำ

3) SAX parser ใน Java เหมาะสำหรับไฟล์ XML ขนาดใหญ่ดีกว่า DOM Parser เนื่องจากไม่ต้องการหน่วยความจำมาก

4) DOM parser ทำงานบน Document Object Model ในขณะที่ SAX เป็นตัวแยกวิเคราะห์ xml แบบอิงเหตุการณ์

อ่านเพิ่มเติม: http://javarevisited.blogspot.com/2011/12/difference-between-dom-and-sax-parsers.html#ixzz2uz1bJQqZ


2

ทั้ง SAX และ DOM ใช้ในการแยกวิเคราะห์เอกสาร XML ทั้งสองมีข้อดีและข้อเสียและสามารถใช้ในการเขียนโปรแกรมของเราขึ้นอยู่กับสถานการณ์

แซ็กโซโฟน:

  1. แยกวิเคราะห์โหนดโดยโหนด

  2. ห้ามเก็บ XML ในหน่วยความจำ

  3. เราไม่สามารถแทรกหรือลบโหนดได้

  4. การเคลื่อนที่ข้ามบนลงล่าง

DOM

  1. เก็บเอกสาร XML ทั้งหมดไว้ในหน่วยความจำก่อนประมวลผล

  2. ตรงบริเวณหน่วยความจำมากขึ้น

  3. เราสามารถแทรกหรือลบโหนด

  4. เข้าไปในทิศทางใดก็ได้

ถ้าเราต้องการค้นหาโหนดและไม่จำเป็นต้องแทรกหรือลบเราสามารถไปกับ SAX เองได้มิฉะนั้น DOM หากเรามีหน่วยความจำเพิ่ม


1

1) DOM parser โหลดเอกสาร XML ทั้งหมดในหน่วยความจำในขณะที่ SAX โหลดเฉพาะส่วนเล็ก ๆ ของไฟล์ XML ในหน่วยความจำ

2) DOM parser เร็วกว่า SAX เพราะเข้าถึงเอกสาร XML ทั้งหมดในหน่วยความจำ

3) SAX parser ใน Java เหมาะสำหรับไฟล์ XML ขนาดใหญ่ดีกว่า DOM Parser เนื่องจากไม่ต้องการหน่วยความจำมาก

4) DOM parser ทำงานบน Document Object Model ในขณะที่ SAX เป็นตัวแยกวิเคราะห์ XML ที่ใช้เหตุการณ์

อ่านเพิ่มเติม: http://javarevisited.blogspot.com/2011/12/difference-between-dom-and-sax-parsers.html#ixzz498y3vPFR

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