1. Pendahuluan
DOM4J adalah API Open Source Java yang sangat baik, terutama digunakan untuk membaca dan menulis dokumen XML, dengan kinerja yang sangat baik, fungsi yang kuat, dan penggunaan yang sangat nyaman. Selain itu, XML sering digunakan untuk pembawa pertukaran data, seperti memanggil parameter yang dilewati oleh layanan web, dan melakukan operasi sinkronisasi data, sehingga sangat penting untuk menggunakan DOM4J untuk parse XML.
2. Kondisi persiapan
dom4j.jar
Alamat unduhan: http://sourceForge.net/projects/dom4j/
3. Gunakan DOM4J untuk berlatih
1. Menguras dokumen XML
Ide Implementasi:
<1> Setelah membaca jalur XML, diteruskan ke Saxreader dan mengembalikan objek dokumen dokumen;
<2> kemudian mengoperasikan objek dokumen ini untuk mendapatkan informasi dari node dan anak -anak berikut;
Kode spesifiknya adalah sebagai berikut:
impor java.io.file; impor javaiofileInputStream; Impor JavaiiinputStream; impor javautiliterator; impor javautillist; impor orgdom4jdocument; impor orgdom4jdocumenthelper; impor orgdom4jelement; impor orgdom4jiosaxreader; /** * Gunakan DOM4J untuk parse dokumen XML * @Author Administrator * */kelas publik DOM4JParSexMldemo {public void parsexml01 () {coba {// Konversi XML di bawah SRC untuk memasukkan inputStream Stream InputStream = newinputStream (baru (baru File ("D:/Project/DynamicWeb/SRC/Resource/Modulexml")); // inputStream inputStream = thisGetClass () getResourCeAsstream ("/modulexml"); // Anda juga dapat menemukan XML berdasarkan jalur relatif dari file yang dikompilasi dari kelas // Buat pembaca Saxreader, khususnya digunakan untuk membaca XML Saxreader Saxreader = SaxReader baru (); // Menurut metode penulisan ulang baca dari Saxreader, dapat dibaca melalui aliran input InputStream atau melalui objek file // dokumen dokumen = Saxreaderread (inputStream); Dokumen Dokumen = SaxReaderRead (file baru ("D:/Project/DynamicWeb/SRC/Resource/Modulexml")); // Jalur absolut file harus ditentukan // Selain itu, konverter XML yang disediakan oleh DocumentHelper juga dapat digunakan. // Dokumen Dokumen = DocumentHelPerParsetext ("<? Xml Version =/" 0/"encoding =/" UTF-8/"?> <Modul ID =/" 123/"> <Modul> Ini adalah informasi teks dari tag modul </module> </podules>"); // Dapatkan elemen objek node root rooteLement = DocumentGetRootElement (); SystemOutPrintln ("Nama simpul root:" + rooteLementGetName ()); // Dapatkan node nama SystemOutPrintln ("Berapa banyak atribut yang dimiliki simpul root:" + rooteLementAttributeCount ()); // Dapatkan jumlah node atribut SystemeMoutPrintln ("nilai node root node node root Nilai Node Atribut ID SystemeMoutPrintln ("Teks di simpul root:" + rooteLementGetText ()); // Jika elemen memiliki anak, ia mengembalikan string kosong, jika tidak teks dalam node akan dikembalikan // label yang digunakan di antara label yang digunakan dan label yang dipertimbangkan oleh label yang dipertimbangkan dan label yang dipertimbangkan, dan label yang dipertimbangkan, dan label yang dipertimbangkan oleh label dan label yang dipertimbangkan oleh label dan label yang dipertimbangkan oleh label. SystemOutPrintln ("Teks (1):" + rooteLementGetTextTrim ()); // Apa yang dihapus adalah kunci tab dan garis istirahat antara tag dan tag, dll., Bukan ruang sebelum dan sesudah SystemOutPrintln ("konten teks dari simpul root node node:" + + + + rootelementStringValue () (); // Kembalikan informasi teks dari semua node anak secara rekursif pada node saat ini. // Dapatkan elemen node anak = rooteLementElement ("module"); if (element! = null) {SystemePutprintln ("Teks sub-node:" + elementGetText ()); // Karena simpul anak dan simpul root adalah objek elemen, metode operasinya sama} // Namun, dalam beberapa kasus, XML lebih rumit dan spesifikasinya tidak bersatu. Tidak ada JavalangnullPointerException langsung untuk node tertentu, jadi setelah mendapatkan objek elemen, Anda harus terlebih dahulu menentukan apakah itu rooteLementsEtName kosong ("root"); // dukungan untuk memodifikasi nama node SystemePutprintln ("Nama setelah node root dimodifikasi:" + rootelementgetName (); rooteLementsetText ("Teks"); // Hal yang sama berlaku untuk memodifikasi teks dalam tag SystemoutPrintln ("Teks setelah node root dimodifikasi:" + rooteLementGetText ()); } catch (Exception e) {ePrintStackTrace (); }} public static void main (string [] args) {dom4jparsexmldemo demo = dom4jparsexmldemo (); demoparsexml01 (); }}Selain itu, XML di atas berada di bawah SRC, Module01.xml adalah sebagai berikut:
<? Xml Version = "0" encoding = "UTF-8"?> <Modul ID = "123"> <podule> Ini adalah informasi teks dari tag modul </module> </todules>
Selanjutnya, jalankan metode utama kelas ini, dan efek konsol adalah sebagai berikut:
Dari ini kita tahu:
<1> Ada banyak cara untuk membaca file XML;
<2> Sangat mudah untuk mengeluarkan teks dan label nama objek elemen;
<3> Dan sangat nyaman untuk memodifikasi teks dan label nama elemen, tetapi tidak akan ditulis ke file disk XML.
Di atas cukup memperoleh elemen direktori root XML, dan kemudian melingkarkan melalui objek dokumen menggunakan iterator iterator.
Kode spesifiknya adalah sebagai berikut:
public void parsexml02 () {coba {// konversi xml di bawah src ke input stream inputStream inputStream = thisGetClass () getResourCeAsstream ("/modulexml"); // Buat pembaca Saxreader khusus untuk membaca xml saxreader saxreader = baru saxreader (); // Menurut metode penulisan ulang baca dari Saxreader, dapat dilihat bahwa dapat dibaca melalui aliran input inputstream, atau dapat dibaca melalui dokumen objek file = SaxreaderRead (inputStream); Elemen rooteLement = DocumentGetRootElement (); Iterator <sement> modulesiterator = rooteLementElements ("module") iterator (); // rooteLementElement ("name"); Dapatkan elemen anak tertentu // rooteLementElements ("name"); Dapatkan set elemen anak node moudule di bawah node root, kembalikan tipe koleksi daftar // rooteLementElements ("module") iterator (); Mengulangi setiap elemen dalam koleksi daftar yang dikembalikan dan mengembalikan semua node anak ke koleksi iterator sementara (ModuleSiteratorHasnext ()) {elemen moduleElement = ModuleSiterArnext (); Elemen nameElement = ModuleElementElement ("Name"); SystemOutPrintln (NameElementGetName () + ":" + NameElementGetText ()); Elemen valueElement = moduleElementElement ("value"); SystemOutPrintln (ValueElementGetName () + ":" + ValueElementGetText ()); Elemen descriptionElement = ModuleElementElement ("Descript"); SystemOutPrintln (descripteLementGetName () + ":" + gambarkanEelementGetText ()); }} catch (Exception e) {ePrintStackTrace (); }} Selain itu, XML di atas berada di bawah SRC, Module02.xml adalah sebagai berikut:
<? Xml Version = "1.0" encoding = "UTF-8"?> <Modul ID = "123"> <podule> <name> OA </name> <value> Konfigurasi Sistem Dasar </value> <descript> Direktori Root Konfigurasi Sistem Dasar </ deskripsi> </odules> </odules>
Selanjutnya, jalankan metode utama kelas ini, dan efek konsol adalah sebagai berikut:
Dari ini kita tahu:
<1> dom4j iterasi lebih dari sub-elemen XML sangat efisien dan nyaman;
Namun, di atas hanya mengulangi elemen node anak XML, tetapi jika aturan XML lebih rumit, seperti module03.xml yang akan diuji selanjutnya, detailnya adalah sebagai berikut:
<? XML Versi = "1.0" encoding = "UTF-8"?> <Modul ID = "123"> <podule> Ini adalah informasi teks dari tag modul </podule> <module id = ""> <name> oa </name> <value> Konfigurasi Sistem Dasar </value> <cescript> Konfigurasi Dasar untuk Sistem </Name </Name> </ Module> <Modul> <name> Konfigurasi Manajemen </name> <value> Tidak ada </value> <descript> Instruksi untuk Mengelola Konfigurasi </ descript> <Modul ID = "106"> <name> Manajemen Sistem </name> <value> </value> <rescript> </descript> <Modul ID = "107"> </value> <rescript> </deskrip <descript> Nomor </ descript> </dodule> </dodule> </dodule> </todules>
Karena struktur mereka berbeda, jika mereka beralih secara langsung, kesalahan akan dilaporkan:
java.lang.nullpointerException
Jadi Anda perlu menggunakannya dengan hati -hati saat ini. Anda tidak dapat memasukkan elemen langsung ke dalam iterasi setiap kali. Kode implementasi spesifik adalah sebagai berikut:
public void parsexMl03 () {coba {// konversi XML di bawah SRC ke input stream inputStream inputStream = thisGetClass () getResourCeAsstream ("/modulexml"); // Buat pembaca Saxreader khusus untuk membaca xml saxreader saxreader = baru saxreader (); // Menurut metode penulisan ulang baca dari Saxreader, dapat dilihat bahwa dapat dibaca melalui aliran input inputstream, atau dapat dibaca melalui dokumen objek file = SaxreaderRead (inputStream); Elemen rooteLement = DocumentGetRootElement (); if (rooteLementElements ("module")! = null) {// Karena tag modul pertama hanya memiliki konten dan tidak ada node anak, iterator () adalah javalangnullpointerexception, sehingga perlu menerapkan daftar <sement> elementList = rooteLementElements ("module"); untuk (elemen elemen: elementList) {if (! elementGetTexttrim () equals ("")) {SystemoutPrintln ("【1】" + elementGetTexttrim ()); } else {elemen nameElement = elementElement ("name"); SystemOutPrintln ("【2】" + NameElementGetName () + ":" + NameElementGetText ()); Elemen valueElement = elementElement ("value"); SystemOutPrintln ("【2】" + valueElementGetName () + ":" + valueElementgetText ()); Elemen descriptionElement = elementElement ("descript"); SystemoutPrintln ("【2】" + DeskripsiElementGetName () + ":" + DescriptionElementGetText ()); Daftar <sement> subelementList = ElementElements ("Modul"); untuk (elemen subelement: subelementList) {if (! SubelementGetTexttrim () sama ("")) {SystemoutPrintln ("【3】" + SubelementGettexttrim ()); } else {element subnameElement = subElementElement ("name"); SystemOutPrintln ("【3】" + SubnameElementGetName () + ":" + SubnameElementGetText ()); Elemen subvalueElement = subelementElement ("value"); SystemOutPrintln ("【3】" + SubValueElementGetName () + ":" + SubValueElementGetText ()); Elemen subdescriptelement = subelementElement ("descript"); SystemOutPrintln ("【3】" + subdescriptelementGetName () + ":" + subdescriptelementgetText ()); }}}}}} catch (Exception e) {ePrintStackTrace (); }}Selanjutnya, jalankan metode utama kelas ini, dan efek konsol adalah sebagai berikut:
Oke, sekarang kita dapat menyelesaikan masalah referensi kosong dalam dokumen berulang.
Selain itu, kode tersebut sebenarnya dapat direfaktor, karena pengoperasian mengambil elemen anak dalam loop berulang, dan dapat ditingkatkan dengan rekursi, tetapi keterbacaan akan sedikit lebih buruk.
Jika Anda kadang-kadang perlu mendapatkan semua informasi teks dalam XML, atau format XML yang disahkan oleh orang lain tidak standar, seperti nama dalam tag peka huruf besar-kecil, meskipun XML tidak peka terhadap kasus, itu harus muncul berpasangan. Jadi untuk menghindari ini, Anda dapat mengubah semua nama tag untuk memanfaatkannya. Kode spesifiknya adalah sebagai berikut:
public static void main(String[] args) { String str = "<?xml version=/"0/" encoding=/"UTF-8/"?><modules id=/"123/"><module> This is the text information of the module tag <name>oa</name><value>Basic configuration</value><descript>Basic configuration of the Sistem </ descript> </dodule> </todules> "; Systemutprintln (strreplaceall ("<[^<]*>", "_")); Pola pola = PatternCompile ("<[^<]*>"); Pencocokan pencocokan = polaMatcher (str); while (matcherFind ()) {str = strreplaceall (matcherGroup (0), matcherGroup (0) touppercase ()); } SystemoutPrintln (str); }Setelah berjalan, rendering adalah sebagai berikut:
2. Hasilkan dokumen XML
DOM4J dapat mengurai XML, dan itu pasti akan menghasilkan XML, dan lebih mudah digunakan.
Ide Implementasi:
<1> DocumentHelper menyediakan metode untuk membuat objek dokumen;
<2> mengoperasikan objek dokumen ini dan tambahkan node dan nilai teks, nama dan atribut di bawah node;
<3> Kemudian gunakan penulis XMLWriter untuk menulis objek dokumen yang dienkapsulasi ke disk;
Kode spesifiknya adalah sebagai berikut:
impor java.io.filewriter; Impor JavaioioException; Impor Javaiowriter; impor orgdom4jdocument; impor orgdom4jdocumenthelper; impor orgdom4jelement; impor orgdom4jioxmlwriter; /** * Gunakan DOM4J untuk menghasilkan dokumen XML * @Author Administrator * */kelas publik DOM4JBuildXMLDEMO {public void build01 () {try {// documentHelper menyediakan metode untuk membuat dokumen dokumen dokumen = DocumentHelperCreateDocument (); // Tambahkan Node Informasi Elemen RootElement = DocumentAddeLement ("Modul"); // Ini dapat terus menambahkan node anak, atau menentukan rooteLementsetText ("Ini adalah informasi teks dari tag modul"); Elemen elemen = rooteLementAddeLement ("module"); Elemen nameElement = elementAddeLement ("name"); Elemen valueElement = elementAddeLement ("value"); Elemen descriptionElement = elementAddeLement ("description"); NameElementsetText ("Name"); NameElementAddattribute ("Bahasa", "Java"); // Tambahkan Nilai Nilai Atribut untuk Node ValueLementsEtsEtext ("Nilai"); valueElementAddattribute ("bahasa", "C#"); descriptionElementsetText ("Deskripsi"); DescriptionElementAddattribute ("Bahasa", "SQL Server"); SystemoutPrintln (DocumentsXML ()); // Konversi objek dokumen langsung menjadi string output penulis fileWriter = fileWriter baru ("c: // modulexml"); // DOM4J menyediakan objek yang ditulis secara khusus untuk file XMLWRITER XMLWRITER XMLWRITER = XMLWRITER baru (FileWriter); xmlwriterwrite (dokumen); xmlwriterflush (); xmlwriterclose (); SystemoutPrintln ("Dokumen XML ditambahkan dengan sukses!"); } catch (ioException e) {ePrintStackTrace (); }} public static void main (string [] args) {dom4jbuildxmldemo demo = dom4jbuildxmldemo () baru; demobuild01 (); }} Efek menjalankan kode adalah sebagai berikut:
Kemudian pergi ke drive C di bawah untuk memeriksa apakah kreasi itu berhasil. Ternyata konten dalam file XML sama dengan output konten oleh konsol.
Selain itu, XML yang dihasilkan di atas tidak menentukan format pengkodean, tetapi UTF-8 masih ditampilkan, menunjukkan bahwa ini adalah format pengkodean default. Jika Anda ingin spesifikasi ulang, Anda dapat menambahkan document.setxmlencoding ("gbk"); sebelum menulis ke disk.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.