1. คำนำ
DOM4J เป็น Java Open Source API ที่ยอดเยี่ยมส่วนใหญ่ใช้สำหรับการอ่านและการเขียนเอกสาร XML ที่มีประสิทธิภาพที่ยอดเยี่ยมฟังก์ชั่นที่ทรงพลังและการใช้งานที่สะดวกมาก นอกจากนี้ XML มักใช้สำหรับผู้ให้บริการแลกเปลี่ยนข้อมูลเช่นการเรียกพารามิเตอร์ที่ส่งผ่านโดยเว็บเซอร์และดำเนินการซิงโครไนซ์ข้อมูลดังนั้นจึงจำเป็นอย่างยิ่งที่จะต้องใช้ DOM4J เพื่อแยกวิเคราะห์ XML
2. เงื่อนไขการเตรียมการ
dom4j.jar
ดาวน์โหลดที่อยู่: http://sourceforge.net/projects/dom4j/
3. ใช้ DOM4J เพื่อฝึกฝน
1. แยกวิเคราะห์เอกสาร XML
แนวคิดการใช้งาน:
<1> หลังจากอ่านเส้นทาง XML มันจะถูกส่งผ่านไปยัง SaxReader และส่งคืนเอกสารเอกสารเอกสาร
<2> จากนั้นใช้งานวัตถุเอกสารนี้เพื่อรับข้อมูลของโหนดและเด็กต่อไปนี้
รหัสเฉพาะมีดังนี้:
นำเข้า Java.io.File; นำเข้า JavaiofileInputStream; นำเข้า JavaioInputStream; นำเข้า Javautiliterator; นำเข้า Javautillist; นำเข้า orgdom4jdocument; นำเข้า orgdom4JDocumentHelper; นำเข้า orgdom4jelement; นำเข้า orgdom4jiosaxreader; /** * ใช้ DOM4J เพื่อแยกวิเคราะห์เอกสาร XML * @author Administrator * */คลาสสาธารณะ Dom4jparsexmldemo {โมฆะสาธารณะ parsexml01 () {ลอง {// แปลง XML ด้านล่าง SRC/อินพุตอินพุต // inputStream inputStream = thisgetClass () getResourceasstream ("/modulexml"); // คุณสามารถค้นหา XML ตามเส้นทางสัมพัทธ์ของไฟล์ที่รวบรวมของคลาส // สร้างเครื่องอ่าน SaxReader โดยเฉพาะที่ใช้ในการอ่าน XML SaxReader SaxReader = new SaxReader (); // ตามวิธีการอ่านใหม่ของ SaxReader สามารถอ่านได้ผ่านสตรีมอินพุตอินพุตอินพุตหรือผ่านวัตถุไฟล์ // เอกสารเอกสาร = SaxReaderRead (inputStream); เอกสารเอกสาร = SaxReaderRead (ไฟล์ใหม่ ("D:/Project/DynamicWeb/Src/Resource/Modulexml")); // เส้นทางที่แน่นอนของไฟล์จะต้องระบุ // นอกจากนี้ยังสามารถใช้ตัวแปลง XML ที่จัดทำโดย DocumentHelper // document document = documenthelperparsetext ("<? xml version =/" 0/"encoding =/" utf-8/"?> <modules id =/" 123/"> <โมดูล> นี่คือข้อมูลข้อความของแท็กโมดูล </โมดูล> </modules>"); // รับรูทองค์ประกอบวัตถุรูทรูทรีเมนต์ = documentGetRootElement (); SystemOutPrintln ("ชื่อโหนดรูท:" + rootElementGetName ()); // รับชื่อโหนด SystemoutPrintln ("โหนดรูทมีจำนวนเท่าใดที่มี:" + rootElementAttributeCount (); ค่าของแอตทริบิวต์โหนด id systememoutprintln ("ข้อความในโหนดรูท:" + rootelementGetText ()); // ถ้าองค์ประกอบมีลูกมันจะส่งคืนสตริงว่างเปล่ามิฉะนั้นข้อความในโหนดจะถูกส่งกลับ // rootelementGetText () SystemOutPrintln ("ข้อความ (1):" + rootElementGetTextTrim ()); // สิ่งที่ถูกลบคือคีย์แท็บและการแบ่งบรรทัดระหว่างแท็กและแท็ก ฯลฯ ไม่ใช่พื้นที่ก่อนและหลังเนื้อหา SystemOutPrintln ("เนื้อหาข้อความของโหนดโหนดโหนด // ส่งคืนข้อมูลข้อความของโหนดเด็กทั้งหมดซ้ำ ๆ บนโหนดปัจจุบัน // รับองค์ประกอบองค์ประกอบโหนดลูก = rootelementElement ("โมดูล"); if (element! = null) {systemeputprintln ("ข้อความย่อยโหนด:" + elementGetText ()); // เนื่องจากโหนดลูกและโหนดรูทเป็นวัตถุองค์ประกอบวิธีการทำงานของพวกเขาจะเหมือนกัน} // อย่างไรก็ตามในบางกรณี XML มีความซับซ้อนมากขึ้น ไม่มี javalangnullpointerexception โดยตรงสำหรับโหนดบางอย่างดังนั้นหลังจากได้รับวัตถุองค์ประกอบคุณต้องพิจารณาก่อนว่ามันจะเป็น rootelementsetName ที่ว่างเปล่า ("root"); // สนับสนุนเพื่อแก้ไขชื่อโหนด SystemEputprintln ("ชื่อหลังจากรูทโหนดได้รับการแก้ไข:" + รูท RootElementsettext ("ข้อความ"); // สิ่งเดียวกันนั้นเป็นจริงสำหรับการแก้ไขข้อความในแท็ก SystemoutPrintln ("ข้อความหลังจากโหนดรูทได้รับการแก้ไข:" + rootElementGetText ()); } catch (exception e) {ePrintStackTrace (); }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {dom4jparsexmldemo demo = ใหม่ dom4jparsexmldemo (); demoparsexml01 (); -นอกจากนี้ XML ข้างต้นอยู่ภายใต้ SRC, Module01.xml มีดังนี้:
<? xml version = "0" encoding = "utf-8"?> <modules id = "123"> <module> นี่คือข้อมูลข้อความของแท็กโมดูล </module> </modules>
ถัดไปดำเนินการวิธีหลักของคลาสนี้และเอฟเฟกต์คอนโซลมีดังนี้:
จากนี้เรารู้:
<1> มีหลายวิธีในการอ่านไฟล์ XML
<2> มันง่ายมากที่จะนำข้อความและชื่อฉลากของวัตถุองค์ประกอบ
<3> และสะดวกมากในการแก้ไขชื่อข้อความและฉลากขององค์ประกอบ แต่จะไม่ถูกเขียนไปยังไฟล์ดิสก์ XML
ข้างต้นได้รับองค์ประกอบของไดเรกทอรีรูทของ XML จากนั้นวนลูปผ่านวัตถุเอกสารเอกสารโดยใช้ตัววนซ้ำ
รหัสเฉพาะมีดังนี้:
โมฆะสาธารณะ parsexml02 () {ลอง {// แปลง XML ด้านล่าง src เป็นอินพุตสตรีมอินพุตอินพุตสตรีม = thisgetClass () getResourceasstream ("/modulexml"); // สร้างเครื่องอ่าน SaxReader โดยเฉพาะสำหรับการอ่าน XML SaxReader SaxReader = new SaxReader (); // ตามวิธีการอ่านซ้ำของ SaxReader จะเห็นได้ว่าสามารถอ่านได้ผ่านสตรีมอินพุตอินพุตอินพุตหรือสามารถอ่านผ่านเอกสารวัตถุไฟล์ = SaxReaderRead (inputStream); Element RootElement = DocumentGetRootelement (); Iterator <Element> MODULESITERATOR = ROOTELEMENTELEMENTS ("MODULE") iterator (); // rootelementElement ("ชื่อ"); รับองค์ประกอบเด็กบางอย่าง // rootelementElements ("ชื่อ"); รับชุดขององค์ประกอบเด็กโหนด moudule ภายใต้โหนดรูทส่งคืนประเภทการรวบรวมรายการ // rootelementElements ("โมดูล") iterator (); ทำซ้ำแต่ละองค์ประกอบในคอลเลกชันรายการที่ส่งคืนและส่งคืนโหนดเด็กทั้งหมดไปยังคอลเลกชันตัววนซ้ำในขณะที่ (ModulesiteratorAtorHasNext ()) {Element ModuleElement = ModulesiteratorNext (); element nameElement = moduleElementElement ("ชื่อ"); SystemOutPrintln (nameElementGetName () + ":" + nameElementGetText ()); Element ValueElement = ModuleElementElement ("value"); SystemOutPrintln (ValueElementGetName () + ":" + ValueElementGetText ()); Element DescriptionElement = ModuleElementElement ("Descript"); SystemOutPrintln (descriptElementGetName () + ":" + disjustEelementGetText ()); }} catch (exception e) {ePrintStackTrace (); - นอกจากนี้ XML ข้างต้นอยู่ภายใต้ SRC, Module02.xml มีดังนี้:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <modules id = "123"> <module> <name> oa </name> <dance> การกำหนดค่าระบบพื้นฐาน </cuels> <Script> การกำหนดค่าระบบพื้นฐาน </descript>
ถัดไปดำเนินการวิธีหลักของคลาสนี้และเอฟเฟกต์คอนโซลมีดังนี้:
จากนี้เรารู้:
<1> DOM4J วนซ้ำมากกว่า XML Sub-Elements มีประสิทธิภาพและสะดวกมาก
อย่างไรก็ตามข้างต้นเพียงแค่วนซ้ำองค์ประกอบโหนดเด็กของ XML แต่ถ้ากฎ XML มีความซับซ้อนมากขึ้นเช่นโมดูล 03.xml ที่จะทดสอบต่อไปรายละเอียดจะมีดังนี้:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <modules id = "123"> <module> นี่คือข้อมูลข้อความของแท็กโมดูล </โมดูล> <โมดูล id = ""> <name> oa </name> </module> <module> <name> การกำหนดค่าการจัดการ </name> <dance> ไม่มี </value> <script> คำสั่งสำหรับการจัดการการกำหนดค่า </script> <module id = "106"> <name> การจัดการระบบ </name> <ales> 0 </value> <script> config </script> <Script> NUMBER </Script> </doDule> </doDule> </ Module> </modules>
เนื่องจากโครงสร้างของพวกเขาแตกต่างกันหากพวกเขาวนซ้ำโดยตรงจะมีการรายงานข้อผิดพลาด:
java.lang.nullpointerexception
ดังนั้นคุณต้องใช้อย่างระมัดระวังในเวลานี้ คุณไม่สามารถใส่องค์ประกอบลงในการวนซ้ำได้โดยตรงทุกครั้ง รหัสการใช้งานเฉพาะมีดังนี้:
โมฆะสาธารณะ parsexml03 () {ลอง {// แปลง XML ด้านล่าง src เป็นอินพุตสตรีมอินพุตอินพุตสตรีม = thisgetClass () getResourceasstream ("/modulexml"); // สร้างเครื่องอ่าน SaxReader โดยเฉพาะสำหรับการอ่าน XML SaxReader SaxReader = new SaxReader (); // ตามวิธีการอ่านซ้ำของ SaxReader จะเห็นได้ว่าสามารถอ่านได้ผ่านสตรีมอินพุตอินพุตอินพุตหรือสามารถอ่านผ่านเอกสารวัตถุไฟล์ = SaxReaderRead (inputStream); Element RootElement = DocumentGetRootelement (); if (rootElementElements ("module")! = null) {// เนื่องจากแท็กโมดูลแรกมีเนื้อหาเท่านั้นและไม่มีโหนดลูก iterator () คือ javalangnullpointerexception ดังนั้นจึงจำเป็นต้องใช้รายการ <Element> ElementList = rootElementElements ("Module"); สำหรับ (องค์ประกอบองค์ประกอบ: elementList) {ถ้า (! elementGetTextTrim () เท่ากับ ("")) {systemoutprintln ("【 1 】" + elementGetTextTrim ()); } else {element nameElement = elementElement ("ชื่อ"); SystemOutPrintln ("【 2 】" + nameElementGetName () + ":" + nameElementGetText ()); Element ValueElement = ElementElement ("value"); SystemOutPrintln ("【 2 】" + valueElementGetName () + ":" + valueElementGetText ()); Element DescriptionElement = ElementElement ("Descript"); SystemOutPrintln ("【 2 】" + DeclectionElementGetName () + ":" + DeclectionElementGetText ()); รายการ <element> subelementList = elementElements ("โมดูล"); สำหรับ (องค์ประกอบย่อย: subelementList) {if (! subelementGetTextTrim () เท่ากับ ("")) {systemoutprintln ("【 3 】" + subelementGetTextTrim ()); } else {องค์ประกอบ subnameElement = sublementElement ("ชื่อ"); SystemOutPrintln ("【 3 】" + subnameElementGetName () + ":" + subnameElementGetText ()); องค์ประกอบ subvalueElement = sublementElement ("value"); SystemOutPrintln ("【 3 】" + subvalueElementGetName () + ":" + subvalueElementGetText ()); องค์ประกอบ subdescriptElement = sublementElement ("descript"); SystemOutPrintln ("【 3 】" + subdescriptElementGetName () + ":" + subdescriptEntementTextText ()); }}}}}} catch (Exception e) {ePrintStackTrace (); -ถัดไปดำเนินการวิธีหลักของคลาสนี้และเอฟเฟกต์คอนโซลมีดังนี้:
ตกลงตอนนี้เราสามารถแก้ปัญหาการอ้างอิงที่ว่างเปล่าในเอกสารซ้ำ
นอกจากนี้รหัสสามารถ refactored จริง ๆ เนื่องจากการดำเนินการขององค์ประกอบเด็กในลูปนั้นซ้ำซากและสามารถปรับปรุงได้โดยการเรียกซ้ำ แต่ความสามารถในการอ่านจะแย่ลงเล็กน้อย
หากบางครั้งคุณจำเป็นต้องได้รับข้อมูลข้อความทั้งหมดใน XML หรือรูปแบบ XML ที่ผ่านโดยผู้อื่นไม่ได้มาตรฐานเช่นชื่อในแท็กนั้นมีความอ่อนไหวเป็นกรณี ๆ ดังนั้นเพื่อหลีกเลี่ยงสิ่งนี้คุณสามารถเปลี่ยนชื่อแท็กทั้งหมดเพื่อใช้ประโยชน์ได้ รหัสเฉพาะมีดังนี้:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {string str = "<? xml version =/" 0/"encoding =/" utf-8/"?> <modules id =/" 123/"> <โมดูล> นี่คือข้อมูลข้อความของแท็กโมดูล <name> System </script> </module> </derules> "; SystemutPrintln (strreplaceall ("<[^<]*>", "_")); รูปแบบรูปแบบ = patterncompile ("<[^<]*>"); matcher matcher = patternmatcher (str); ในขณะที่ (matcherfind ()) {str = strreplaceall (matcherGroup (0), matcherGroup (0) touppercase ()); } systemoutprintln (str); -หลังจากทำงานแล้วการเรนเดอร์มีดังนี้:
2. สร้างเอกสาร XML
DOM4J สามารถแยกวิเคราะห์ XML และมันจะสร้าง XML อย่างแน่นอนและใช้งานง่ายกว่า
แนวคิดการใช้งาน:
<1> DocumentHelper มีวิธีการสร้างวัตถุเอกสาร
<2> ใช้งานวัตถุเอกสารนี้และเพิ่มโหนดและค่าข้อความชื่อและแอตทริบิวต์ภายใต้โหนด
<3> จากนั้นใช้นักเขียน XMLWriter เพื่อเขียนวัตถุเอกสารที่ห่อหุ้มไปยังดิสก์
รหัสเฉพาะมีดังนี้:
นำเข้า java.io.filewriter; นำเข้า JavaioioException; นำเข้า Javaiowriter; นำเข้า orgdom4jdocument; นำเข้า orgdom4JDocumentHelper; นำเข้า orgdom4jelement; นำเข้า orgdom4jioxmlwriter; /** * ใช้ DOM4J เพื่อสร้างเอกสาร XML * @author Administrator * */คลาสสาธารณะ Dom4jbuildxmldemo {โมฆะสาธารณะ build01 () {ลอง {// documenthelper จัดเตรียมวิธีการสร้างเอกสารเอกสารเอกสารเอกสาร = documenthelpercreatedocument (); // เพิ่มองค์ประกอบของข้อมูลโหนดข้อมูลรูทรีเมนต์ = DocumentAdDelement ("โมดูล"); // สิ่งนี้สามารถเพิ่มโหนดลูกต่อไปหรือระบุรูทรีเมนต์เนื้อหา ("นี่คือข้อมูลข้อความของแท็กโมดูล"); องค์ประกอบองค์ประกอบ = rootElementAdDelement ("โมดูล"); element nameElement = elementAdDelement ("ชื่อ"); Element ValueElement = ElementAdDelement ("value"); Element DescriptionElement = ElementAdDelement ("คำอธิบาย"); NameElementSettext ("ชื่อ"); NameElementAdDattribute ("ภาษา", "java"); // เพิ่มค่าแอตทริบิวต์สำหรับ Node ValueElementettext ("value"); ValueElementAdDattribute ("ภาษา", "C#"); DescriptionElementestext ("คำอธิบาย"); DescriptionElementAdDattribute ("ภาษา", "SQL Server"); SystemOutPrintln (Documentsxml ()); // แปลงวัตถุเอกสารโดยตรงเป็นนักเขียนเอาต์พุตสตริง fileWriter = ใหม่ fileWriter ("C: // modulexml"); // DOM4J จัดเตรียมวัตถุที่เขียนโดยเฉพาะไปยังไฟล์ XMLWriter XMLWriter XMLWriter = New XMLWriter (FileWriter); XMLWriterWrite (เอกสาร); xmlwriterflush (); xmlwriterclose (); SystemOutPrintln ("เอกสาร XML ถูกเพิ่มสำเร็จ!"); } catch (ioexception e) {ePrintStackTrace (); }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {dom4jbuildxmldemo demo = ใหม่ dom4jbuildxmldemo (); demobuild01 (); - ผลของการเรียกใช้รหัสมีดังนี้:
จากนั้นไปที่ไดรฟ์ C ด้านล่างเพื่อตรวจสอบว่าการสร้างประสบความสำเร็จหรือไม่ ปรากฎว่าเนื้อหาในไฟล์ XML นั้นเหมือนกับเอาต์พุตเนื้อหาโดยคอนโซล
นอกจากนี้ XML ที่สร้างขึ้นข้างต้นไม่ได้ระบุรูปแบบการเข้ารหัส แต่ UTF-8 ยังคงปรากฏขึ้นซึ่งระบุว่านี่เป็นรูปแบบการเข้ารหัสเริ่มต้น หากคุณต้องการระบุตัวตนอีกครั้งคุณสามารถเพิ่ม document.setxmlencoding ("GBK"); ก่อนเขียนลงในดิสก์
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น