<?xml version="1.0" encoding="GBK"?>
<Phone>
<Brand name="Apple">
<Type name="iphone 8s"/>
</Brand>
<Brand name="HuaWei">
<Type name="荣耀"/>
</Brand>
<Brand name="小米">
<Type name="小米5s"/>
</Brand>
<Brand name="小米">
<Type name="小米5s"/>
</Brand>
</Phone>
package com.cn;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.QName;
import org.dom4j.dom.DOMAttribute;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class TestDoc4j {
Document doc = null;
public static void main(String[] args) {
TestDoc4j td = new TestDoc4j();
// 1. 加载DOM树(读取XML文档)
td.loadDocument();
// 2. 读取DOM树文档内容
// td.showInfo();
// 3. 保存xml文件
// String path = "src/com/cn/xml/new.xml";
// td.saveXML(path);
// 4.添加节点信息到xml文件
// td.addElementInfo();
// 展示一下
// td.showInfo();
// 5.修改节点信息到xml文件
td.changeElementInfo();
// 6.删除节点信息
td.deleteElementInfo();
td.showInfo();
}
private void deleteElementInfo() {
// 获取根节点
Element root = doc.getRootElement();
// 把根节点中所有的子节点全部放入迭代器
@SuppressWarnings("unchecked")
Iterator<Element> iterator = root.elementIterator();
// 循环遍历根节点
while (iterator.hasNext()) {
Element brandEle = iterator.next();
// 把当前节点的name属性值与OPPO匹配,如果匹配,则移除该点
if (brandEle.attributeValue("name").equals("OPPO")) {
// 找到brand品牌节点的父节点,然后移除name值为OPPO的brand节点
brandEle.getParent().remove(brandEle);
// 通过创建DOMAttribute对象,用QName.get获取指定属性清除指定节点指定属性
brandEle.remove(new DOMAttribute(QName.get("id")));
break;// 只要删除找到匹配的第一个就跳出循环
}
}
this.saveXML("src/com/cn/xml/new.xml");
}
private void changeElementInfo() {
// 1.1 得到标签对象
Element elem = doc.getRootElement().element("Brand");
// 1.2 得到id属性对象 修改属性值
elem.attribute("name").setValue("xixi");
/**
* 修改属性值(方案二) 方法:Element标签类的addAttribute("attr","value")方法
*/
/*
* //1.得到属性值标签 Element stuElem=doc.getRootElement().element("student");
* //2.通过增加同名属性的方法,修改属性值 stuElem.addAttribute("id", "000009");
* //key相同,覆盖;不存在key,则添加
*/
/**
* 修改文本 方法:Element标签类的setTest("新文本值")方法 1.得到标签对象 2.修改文本
*/
Element nameElem = doc.getRootElement().element("Brand")
.element("Type1");
nameElem.setText("王二麻子");
this.saveXML("src/com/cn/xml/new.xml");
}
private void addElementInfo() {
// 获取根节点
Element rootele = doc.getRootElement();
// 添加Brand子节点给根节点
Element brandele = rootele.addElement("Brand");
// 给Brand节点增加属性及属性值
brandele.addAttribute("name", "小米");
// 给Brand节点增加子节点Type
Element type = brandele.addElement("Type");
// 给Type增加属性及属性值
type.addAttribute("name", "小米5s");
// 保存新增信息
this.saveXML("src/com/cn/xml/new.xml");
}
private void saveXML(String path) {
// 1.创建XMLWriter字符输出流对象
XMLWriter xmlwriter = null;
try {
// 2. 创建writer对象指向FileWriter,并把地址给出
Writer writer = new FileWriter(path);
// 3. 指定xml生成时,声明中的Ecoding字符集编码格式
// OutputFormat of = new OutputFormat();
// 自动换行缩进
OutputFormat of = OutputFormat.createPrettyPrint();
of.setEncoding("GBK");
// 4. 把指定的xml格式及文件输出流对象,利用xmlWriter输出到指定目的地输出文件
xmlwriter = new XMLWriter(writer, of);
// 5. 调用writer方法,以DOM树为入参,生成xml文件
xmlwriter.write(doc);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
xmlwriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void showInfo() {
Element ele = doc.getRootElement();// 获取根节点对象
@SuppressWarnings("unchecked")
Iterator<Element> it = ele.elementIterator();// 从根节点中获取子节点
while (it.hasNext()) {
Element ite = it.next();
String brandName = ite.attributeValue("name");// 读取品牌名称
@SuppressWarnings("unchecked")
Iterator<Element> itType = ite.elementIterator();// 品牌下所有手机型号节点
while (itType.hasNext()) {
Element itT = itType.next();
String type = itT.attributeValue("name");
// String type=itT.getStringValue();//读取文本格式
System.out.println(brandName + " " + type);
}
}
}
private void loadDocument() {
SAXReader sr = new SAXReader();
try {
// 接收读到的文件
doc = sr.read("src/com/cn/xml/new.xml");
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}