在整理dow4j解析xml進行增刪查改時,百度谷歌了一天沒有發現比較完整的程序,自己整理加上自己的一些想法整理了一份程序
項目結構:
xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book name="書本1">
<name>大話數據結構</name>
<year>2019</year>
<price>77</price>
<language>中文</language>
</book>
<book name="書本2">
<name>kvm</name>
<year>2019</year>
<price>66</price>
<language>英文</language>
</book>
<book name="書本3">
<name>數據庫</name>
<year>2019年</year>
<price>16</price>
<language>中文</language>
</book>
<book name="書本4">
<name>空調</name>
<year>2019年</year>
<price>16</price>
<language>製冷</language>
</book>
<book name="書本5">
<name>風扇</name>
<year>1999年</year>
<price>88</price>
<language>漢化版</language>
</book>
<book name="書本6">
<name>Java大全</name>
<year>1986年</year>
<price>88</price>
<language>最流行編程之一</language>
</book>
</bookstore>
對應的代碼:
package dom4j;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.*;
import java.util.Iterator;
import java.util.List;
//dom4j解析xml並且執行(增、刪、改、查)操作
public class Dom4JCRUD {
private Document document;
public static void main(String[] args){
Dom4JCRUD domXml = new Dom4JCRUD();
domXml.getDom();
domXml.addPhoneInfo();/**增加節點,不會添加id屬性*/
domXml.deletePhoneInfo();/**刪除節點*/
domXml.updatePhoneInfo();/**修改節點*/
domXml.showPhoneInfo();/**遍歷節點*/
}
//獲取DOM樹
public void getDom(){
SAXReader reader = new SAXReader();
try {
document = reader.read(new File("src/dom4j/books.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
}
//增加節點信息
public void addPhoneInfo(){
//獲取根節點元素
Element element = document.getRootElement();
//添加節點
Element book = element.addElement("book");
//爲根節點添加屬性並且賦值
book.addAttribute("name","書本7");
Element name=book.addElement("name");
Element year=book.addElement("year");
Element price=book.addElement("price");
Element language=book.addElement("language");
name.setText("Python");
year.setText("1968年");
price.setText("16");
language.setText("最流行編程之一");
saveXml("src/dom4j/books.xml");
}
//刪除節點信息
public void deletePhoneInfo(){
//獲取根節點
Element element = document.getRootElement();
Iterator books = element.elementIterator();
//遍歷獲取每個節點信息
while(books.hasNext()){
Element book = (Element)books.next();
//刪除name爲某一值的節點
String deleteBookName = "書本6";
System.out.println("刪除的節點名爲:"+book.attributeValue("name"));
if(book.attributeValue("name").equals(deleteBookName)){
book.getParent().remove(book);
}
}
//保存信息
saveXml("src/dom4j/books.xml");
}
//修改節點信息
public void updatePhoneInfo(){
//獲取信息
Element element = document.getRootElement();
Iterator books = element.elementIterator();
//遍歷獲取每個節點信息
while(books.hasNext()){
Element book = (Element)books.next();
//修改name爲某一值的節點
String updateBookName ="書本7";
System.out.println("需要修改的節點名爲:"+book.attributeValue("name"));
if(book.attributeValue("name").equals(updateBookName)){
//解析子節點的信息
Iterator itt = book.elementIterator();
while (itt.hasNext()) {
Element bookChild = (Element) itt.next();
//修改子節點名爲name的值
String name ="name";
if(bookChild.getName().equals(name)){
System.out.println("節點名:" + bookChild.getName() + "--原節點值:" + bookChild.getStringValue());
bookChild.setText("Python大全");
System.out.println("節點名:" + bookChild.getName() + "--修改後的節點值:" + bookChild.getStringValue());
}
//修改子節點名爲year的值
String year ="year";
if(bookChild.getName().equals(year)){
System.out.println("節點名:" + bookChild.getName() + "--原節點值:" + bookChild.getStringValue());
bookChild.setText("1996年");
System.out.println("節點名:" + bookChild.getName() + "--修改後的節點值:" + bookChild.getStringValue());
}
//修改子節點名爲price的值
String price ="price";
if(bookChild.getName().equals(price)){
System.out.println("節點名:" + bookChild.getName() + "--原節點值:" + bookChild.getStringValue());
bookChild.setText("88");
System.out.println("節點名:" + bookChild.getName() + "--修改後的節點值:" + bookChild.getStringValue());
}
//修改子節點名爲language的值
String language ="language";
if(bookChild.getName().equals(language)){
System.out.println("節點名:" + bookChild.getName() + "--原節點值:" + bookChild.getStringValue());
bookChild.setText("被人工智能帶火的語言");
System.out.println("節點名:" + bookChild.getName() + "--修改後的節點值:" + bookChild.getStringValue());
}
}
}
}
/**重新排序一下xml,加上id*/
Iterator addBookId = document.getRootElement().elementIterator();//這是把兩行代碼合成一行了
int id = 0;
while(addBookId.hasNext()){
Element addId = (Element)addBookId.next();
id++;
addId.addAttribute("id",id+"");
}
saveXml("src/dom4j/books.xml");
}
//顯示節點信息
public void showPhoneInfo() {
// 通過document對象獲取根節點bookstore
Element element = document.getRootElement();
// 通過element對象的elementIterator方法獲取迭代器
Iterator books = element.elementIterator();
// 遍歷迭代器,獲取根節點中的信息(書籍)
int i=1;
while (books.hasNext()) {
System.out.println("=====開始遍歷第"+ i +"個節點=====");
Element book = (Element) books.next();
// 獲取book的屬性名以及 屬性值
List<Attribute> bookAttrs = book.attributes();
for (Attribute attr : bookAttrs) {
System.out.println("屬性名:" + attr.getName() + "--屬性值:" + attr.getValue());
}
//解析子節點的信息
Iterator itt = book.elementIterator();
while (itt.hasNext()) {
Element bookChild = (Element) itt.next();
System.out.println("節點名:" + bookChild.getName() + "--節點值:" + bookChild.getStringValue());
}
System.out.println("=====結束遍歷第"+ i +"個節點=====");
i++;
}
}
//保存信息到xml
public void saveXml(String path){
//格式化
OutputFormat format = OutputFormat.createPrettyPrint();
//指定字符編碼格式
format.setEncoding("UTF-8");
XMLWriter writer = null;
//將文件按照指定格式輸出到指定路徑中
try {
writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(path)),format);
writer.write(document);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
//關閉服務
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
這個添加節點默認沒有id屬性,在修改代碼裏有重新排序xml加上id的代碼:
/**重新排序一下xml,加上id*/
Iterator addBookId = document.getRootElement().elementIterator();//這是把兩行代碼合成一行了
int id = 0;
while(addBookId.hasNext()){
Element addId = (Element)addBookId.next();
id++;
addId.addAttribute("id",id+"");
}
如果xml中節點是嵌套的也可以進行解析,例如:
<book name="書本1">
<name>
<name1>大話數據結構</name1>
<name2>大話數據庫</name2>
<name3>設計模式</name3>
</name>
<year>2019</year>
<price>77</price>
<language>中文</language>
</book>
如有問題歡迎指出。