ใน Java มีสองวิธีในการแยกวิเคราะห์เอกสาร XML โดยกำเนิด ได้แก่: การแยกวิเคราะห์ Dom และการแยกวิเคราะห์ Sax
ฟังก์ชันการแยกวิเคราะห์ Dom มีประสิทธิภาพและสามารถเพิ่ม ลบ แก้ไข และตรวจสอบได้ ในระหว่างการดำเนินการ เอกสาร xml จะถูกอ่านลงในหน่วยความจำในรูปแบบของวัตถุเอกสาร ดังนั้นจึงเหมาะสำหรับเอกสารขนาดเล็ก
การแยกวิเคราะห์แซ็กโซโฟนจะอ่านเนื้อหาทีละบรรทัดและองค์ประกอบทีละองค์ประกอบตั้งแต่ต้นจนจบ การปรับเปลี่ยนจะไม่สะดวกกว่า แต่เหมาะสำหรับเอกสารแบบอ่านอย่างเดียวขนาดใหญ่
บทความนี้จะอธิบายการแยกวิเคราะห์ Sax เป็นหลัก และส่วนที่เหลือจะอธิบายในภายหลัง
Sax ใช้วิธีการขับเคลื่อนด้วยเหตุการณ์เพื่อแยกวิเคราะห์เอกสาร พูดง่ายๆ ก็เหมือนกับการดูหนังในโรงหนัง คุณสามารถชมตั้งแต่ต้นจนจบโดยไม่ต้องย้อนกลับไป (ดอมสามารถอ่านกลับไปกลับมาได้)
ในกระบวนการดูหนัง ทุกครั้งที่เจอโครงเรื่อง น้ำตาไหล หรือเผชิญหน้ากัน คุณจะระดมสมองและเส้นประสาทเพื่อรับหรือประมวลผลข้อมูลนี้
ในทำนองเดียวกัน ในระหว่างกระบวนการแยกวิเคราะห์ของ Sax การอ่านจุดเริ่มต้นและจุดสิ้นสุดของเอกสาร และจุดเริ่มต้นและจุดสิ้นสุดขององค์ประกอบจะทริกเกอร์วิธีการโทรกลับบางวิธี คุณสามารถดำเนินการประมวลผลเหตุการณ์ที่สอดคล้องกันในวิธีการโทรกลับเหล่านี้
สี่วิธีคือ: startDocument(), endDocument(), startElement(), endElement
นอกจากนี้ การอ่านโหนดยังไม่เพียงพอ เรายังต้องการเมธอด character() เพื่อประมวลผลเนื้อหาที่อยู่ในองค์ประกอบอย่างระมัดระวัง
เมื่อรวบรวมวิธีการโทรกลับเหล่านี้ ก็จะเกิดคลาสขึ้นซึ่งเป็นตัวกระตุ้นที่เราต้องการ
โดยทั่วไป เอกสารจะถูกอ่านจากวิธีการหลัก แต่เอกสารจะถูกประมวลผลในทริกเกอร์ นี่คือวิธีที่เรียกว่าการแยกวิเคราะห์ที่ขับเคลื่อนด้วยเหตุการณ์
ดังที่แสดงไว้ข้างต้น ในทริกเกอร์ ขั้นแรกจะเริ่มอ่านเอกสาร จากนั้นจึงเริ่มแยกวิเคราะห์องค์ประกอบทีละรายการ เนื้อหาของแต่ละองค์ประกอบจะถูกส่งกลับไปยังเมธอด character()
จากนั้นสิ้นสุดการอ่านองค์ประกอบ หลังจากอ่านองค์ประกอบทั้งหมดแล้ว ให้สิ้นสุดการแยกวิเคราะห์เอกสาร
ตอนนี้เราเริ่มสร้างคลาสทริกเกอร์ ในการสร้างคลาสนี้ เราต้องสืบทอด DefaultHandler ก่อน
สร้าง SaxHandler และแทนที่วิธีการที่เกี่ยวข้อง:
SaxHandler คลาสสาธารณะขยาย DefaultHandler {
/* เมธอดนี้มีพารามิเตอร์สามตัว
arg0 คืออาร์เรย์อักขระที่ส่งคืน ซึ่งมีเนื้อหาองค์ประกอบ
arg1 และ arg2 เป็นตำแหน่งเริ่มต้นและสิ้นสุดของอาร์เรย์ตามลำดับ*/
@แทนที่
อักขระโมฆะสาธารณะ (ถ่าน [] arg0, int arg1, int arg2) พ่น SAXException {
เนื้อหาสตริง = สตริงใหม่ (arg0, arg1, arg2);
System.out.println (เนื้อหา);
super.ตัวละคร(arg0, arg1, arg2);
-
@แทนที่
โมฆะสาธารณะ endDocument () พ่น SAXException {
System.out.println("/n...สิ้นสุดการแยกวิเคราะห์เอกสาร...");
ซุปเปอร์.endDocument();
-
/* arg0 คือเนมสเปซ
arg1 คือป้ายกำกับที่มีเนมสเปซ หรือว่างเปล่าหากไม่มีเนมสเปซ
arg2 เป็นป้ายกำกับที่ไม่มีเนมสเปซ*/
@แทนที่
โมฆะสาธารณะ endElement (String arg0, String arg1, String arg2)
พ่น SAXException {
System.out.println("สิ้นสุดการแยกวิเคราะห์องค์ประกอบ" + arg2);
super.endElement(arg0, arg1, arg2);
-
@แทนที่
โมฆะสาธารณะ startDocument () พ่น SAXException {
System.out.println("…………เริ่มแยกวิเคราะห์เอกสาร………/n");
super.startDocument();
-
/*arg0 คือเนมสเปซ
arg1 คือป้ายกำกับที่มีเนมสเปซ หรือว่างเปล่าหากไม่มีเนมสเปซ
arg2 เป็นป้ายกำกับที่ไม่มีเนมสเปซ
เห็นได้ชัดว่า arg3 เป็นชุดของคุณลักษณะ*/
@แทนที่
โมฆะสาธารณะ startElement (สตริง arg0, สตริง arg1, สตริง arg2,
แอตทริบิวต์ arg3) พ่น SAXException {
System.out.println("เริ่มการแยกวิเคราะห์องค์ประกอบ" + arg2);
ถ้า (arg3 != null) {
สำหรับ (int i = 0; i <arg3.getLength(); i++) {
// getQName() คือการรับชื่อแอตทริบิวต์
System.out.print(arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
-
-
System.out.print(arg2 + ///);
super.startElement(arg0, arg1, arg2, arg3);
-
-
นำเข้า javax.xml.parsers.SAXParser;
นำเข้า javax.xml.parsers.SAXParserFactory;
TestDemo ระดับสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) พ่นข้อยกเว้น {
// 1. สร้างอินสแตนซ์ของวัตถุ SAXParserFactory
โรงงาน SAXParserFactory = SAXParserFactory.newInstance();
// 2. สร้างตัวแยกวิเคราะห์
ตัวแยกวิเคราะห์ SAXParser = โรงงานใหม่SAXParser();
// 3. รับเอกสารที่ต้องแยกวิเคราะห์ สร้าง parser และสุดท้ายแยกวิเคราะห์เอกสาร
ไฟล์ f = ไฟล์ใหม่ ("books.xml");
SaxHandler dh = SaxHandler ใหม่ ();
parser.parse(f, dh);
-
-
เริ่มแยกวิเคราะห์หนังสือองค์ประกอบ
หนังสือ:
เริ่มแยกวิเคราะห์หนังสือองค์ประกอบ
id="001"หนังสือ:
เริ่มแยกวิเคราะห์ชื่อองค์ประกอบ
หัวเรื่อง:แฮร์รี่ พอตเตอร์
สิ้นสุดการแยกวิเคราะห์ชื่อองค์ประกอบ
เริ่มแยกวิเคราะห์ผู้เขียนองค์ประกอบ
ผู้เขียน: เจ.เค. โรว์ลิ่ง
สิ้นสุดผู้เขียนองค์ประกอบการแยกวิเคราะห์
สิ้นสุดหนังสือองค์ประกอบการแยกวิเคราะห์
เริ่มแยกวิเคราะห์หนังสือองค์ประกอบ
id="002"หนังสือ:
เริ่มแยกวิเคราะห์ชื่อองค์ประกอบ
หัวเรื่อง:การเรียนรู้ XML
สิ้นสุดการแยกวิเคราะห์ชื่อองค์ประกอบ
เริ่มแยกวิเคราะห์ผู้เขียนองค์ประกอบ
ผู้เขียน: เอริค ที. เรย์
สิ้นสุดผู้เขียนองค์ประกอบการแยกวิเคราะห์
สิ้นสุดหนังสือองค์ประกอบการแยกวิเคราะห์
สิ้นสุดการแยกวิเคราะห์หนังสือองค์ประกอบ
…………สิ้นสุดการแยกวิเคราะห์เอกสาร…………
เพื่อดำเนินการกระบวนการนี้ให้ชัดเจนยิ่งขึ้น เรายังสามารถเขียน SaxHandler ใหม่เพื่อกู้คืนเอกสาร xml ดั้งเดิมได้
คลาส SaxHandler ที่ถูกแทนที่:
SaxHandler คลาสสาธารณะขยาย DefaultHandler {
@แทนที่
อักขระโมฆะสาธารณะ (ถ่าน [] arg0, int arg1, int arg2) พ่น SAXException {
System.out.print (สตริงใหม่ (arg0, arg1, arg2));
super.ตัวละคร(arg0, arg1, arg2);
-
@แทนที่
โมฆะสาธารณะ endDocument () พ่น SAXException {
System.out.println("/n สิ้นสุดการแยกวิเคราะห์");
ซุปเปอร์.endDocument();
-
@แทนที่
โมฆะสาธารณะ endElement (String arg0, String arg1, String arg2)
พ่น SAXException {
System.out.print("</");
System.out.print(arg2);
System.out.print(">");
super.endElement(arg0, arg1, arg2);
-
@แทนที่
โมฆะสาธารณะ startDocument () พ่น SAXException {
System.out.println("เริ่มการแยกวิเคราะห์");
สตริง s = "<?xml version=/"1.0/" encoding=/"UTF-8/"?>";
System.out.println(s);
super.startDocument();
-
@แทนที่
โมฆะสาธารณะ startElement (สตริง arg0, สตริง arg1, สตริง arg2,
แอตทริบิวต์ arg3) พ่น SAXException {
System.out.print("<");
System.out.print(arg2);
ถ้า (arg3 != null) {
สำหรับ (int i = 0; i <arg3.getLength(); i++) {
System.out.print(" " + arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
-
-
System.out.print(">");
super.startElement(arg0, arg1, arg2, arg3);
-
-
ตอนนี้ดูดีขึ้นมากแล้ว และการคืนค่าให้ดีขึ้นจะแสดงให้เห็นกระบวนการแยกวิเคราะห์ของมัน