在整理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>
如有问题欢迎指出。