Java 使用 Dom4j 解析XML
今天給大家分享一個我剛學到的、、、如何使用Dom4j解析XML文件
環境準備
(1)下載dom4j-2.1.1.jar
(2)JDK 1.8以上
(3)我用的IDEA(大家隨意)
Dom4j解析XML的含義
解析XML過程是通過獲取Document對象,然後繼續獲取各個節點以及屬性等操作
Dom4j解析XML的過程
首先,我們寫一個XML文件,然後對他進行一系列操作
info.xml 代碼如下
<?xml version="1.0" encoding="UTF-8"?>
<phoneInfo>
<brand name="小米">
<type name="小米8"/>
<type name="小米9"/>
<type name="小米MIX"/>
</brand>
<brand name="iphone">
<type name="IPhoneX"/>
<type name="IPhoneXs"/>
<type name="IPhone7"/>
</brand>
<brand name="華爲">
<type name="P20"/>
<type name="P30"/>
<type name="P30 pro"/>
</brand>
</phoneInfo>
有了xml文件後,我們就可以對他進行一系列操作了
我們先在控制檯進行對xml文件的讀取
我們先建一個測試類Test.class
package cn.kgc.dom4jtest;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
SAXReader saxReader = new SAXReader();
try {
//讀取xml文件,生成document對象
Document document = saxReader.read("src/info.xml");
Element rootElement = document.getRootElement();
System.out.println("根節點的名字:"+rootElement.getName());
//獲取子節點列表
Iterator it = rootElement.elementIterator();
while (it.hasNext()){
Element firstChild = (Element) it.next();
System.out.println(firstChild.getName());
//獲取節點的屬性值
System.out.println(firstChild.attribute("name").getValue());
//獲取子節點的下一級節點
Iterator iterator = firstChild.elementIterator();
while (iterator.hasNext()){
Element element = (Element) iterator.next();
System.out.println("\t"+element.attributeValue("name"));
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
運行結果如下:
然後我們再建一個AddTest.class
進行添加數據
package cn.kgc.dom4jtest;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.*;
public class AddTest1 {
public static void main(String[] args){
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read("src/info.xml");
Element rootElement = document.getRootElement();
//添加一個子節點
Element brand = rootElement.addElement("brand");
//給當前節點添加屬性
brand.addAttribute("name","魅族");
Element type = brand.addElement("type");
type.addAttribute("name","s16");
OutputStream os = new FileOutputStream(new File("src/info.xml"));
XMLWriter xmlWriter = new XMLWriter(os);
xmlWriter.write(rootElement);
xmlWriter.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我們打開自己的xml文件,查看是否發生了變化
有了這句話就對了,然後我們再建一個UpdateTest.class
package cn.kgc.dom4jtest;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
public class updataTest {
public static void main(String[] args) {
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read("src/info.xml");
//獲取根節點
Element rootElement = document.getRootElement();
Iterator it = rootElement.elementIterator();
while(it.hasNext()){
Element element = (Element) it.next();
System.out.println(element.attributeValue("name"));
if (element.attributeValue("name").equals("魅族")){
Iterator iterator = element.elementIterator();
while (iterator.hasNext()){
Element type = (Element) iterator.next();
if (type.attributeValue("name").equals("s16")){
type.addAttribute("name","16 pro");
}
}
}
}
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("src/info.xml")));
xmlWriter.write(document);
xmlWriter.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
運行結果如下:
成功後我們就可以做接下來的刪除了
我們再建個刪除類DeleteTest
package cn.kgc.dom4jtest;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
/**
* lxl
* 刪除測試
*/
public class DeleteTest {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
try {
Document document = reader.read("src/info.xml");
Element rootElement = document.getRootElement();
Iterator iterator = rootElement.elementIterator();
while(iterator.hasNext()){
Element brand = (Element) iterator.next();
if (brand.attributeValue("name").equals("魅族")){
//通過父節點刪除子節點
brand.getParent().remove(brand);
}
}
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("src/info.xml")));
xmlWriter.write(document);
xmlWriter.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我們運行成功後可以看一下我們的XML,會發現裏面就剩一個根目錄了,不要慌,刪了就對了
最後,我給大家封裝了一個讀取XML文件的方法,方便大家使用
public void List(Element root){
System.out.println("根節點的姓名:"+root.getName());
//獲取子節點列表
Iterator it = root.elementIterator();
while (it.hasNext()){
Element fristChild = (Element) it.next();
System.out.println(fristChild.getName());
System.out.println(" "+fristChild.attribute("name").getValue());
Iterator iterator = fristChild.elementIterator();
while (iterator.hasNext()){
Element element = (Element) iterator.next();
System.out.println("\t"+element.attributeValue("name"));
}
}
}
最後,歡迎各位大佬多多指點
有一起學習的可以加我微信:lxl1052681394