周一满课好累|・ω・`),尽量发图片和代码说事吧。朴乾老师上课时画的张关于dom解析和sax解析的图片。
基于这两种解析思想市面上就有了很多的解析api,如sun jaxp(好像很低效果),dom4j,pull等等。
就跟着老师讲的了解一下dom4j的基本使用,比如用dom4j进行增删改查之类的。首先,在eclipse中导入dom4j的包,然后新建了一个xml文档,名字叫做dorm.xml
<宿舍>
<室友 特征="吹牛">
<姓名>
张三
<性别>
男
<年龄>
20岁
<室友>
<姓名>
李四
<性别>
男
<年龄>
19岁
然后新建一个Dom4j1.java
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4j1 {
public static void main(String[] args) throws Exception{
//1.获取解析器
SAXReader reader = new SAXReader();
//2.解析xml获取代表整个文档的dom对象
Document dom = reader.read("dorm.xml");
//3.获取根节点
Element root = dom.getRootElement();
//4.只能获取第一个室友的姓名
String rmname = root.element("室友").element("姓名").getText();
System.out.println(rmname);
}
}
但是只能查询第一个室友的名字,我们可以用一个集合来装elements()带来的子元素,
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
public class Dom4j2 {
//增加
@Test
public void add() throws Exception{
//1.获取解析器
SAXReader reader = new SAXReader();
//2.解析xml获取代表整个文档的dom对象
Document dom = reader.read("dorm.xml");
//3.获取根节点
Element root = dom.getRootElement();
//4.创建
<爱好>
节点,设置标签体
Element hobbyEle = DocumentHelper.createElement("爱好");
hobbyEle.setText("打游戏");
//5.获取父节点
<室友>
将节点挂上去,但是只存在于内存
Element rmEle = root.element("室友");
rmEle.add(hobbyEle);
//6.将内存中的dom数回写到xml
/*用gb2312编码写入,如果xml文档其他编码格式会乱码
FileWriter writer = new FileWriter("dorm.xml");
dom.write(writer);
writer.flush();
writer.close(); */
//不会乱码
XMLWriter writer = new XMLWriter(new FileOutputStream("dorm.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
}
//删除
@Test
public void delete() throws Exception{
//1.获取解析器
SAXReader reader = new SAXReader();
//2.解析xml获取代表整个文档的dom对象
Document dom = reader.read("dorm.xml");
//3.获取根节点
Element root = dom.getRootElement();
//4.获取节点的父类删除节点
Element hobbyEle = root.element("室友").element("爱好");
hobbyEle.getParent().remove(hobbyEle);
//5.更新xml文档
XMLWriter writer = new XMLWriter(new FileOutputStream("dorm.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
}
//修改
@Test
public void update() throws Exception{
//1.获取解析器
SAXReader reader = new SAXReader();
//2.解析xml获取代表整个文档的dom对象
Document dom = reader.read("dorm.xml");
//3.获取根节点
Element root = dom.getRootElement();
//4.修改
<爱好>
的标签体
root.element("室友").element("爱好").setText("打篮球");
//5.更新xml文档
XMLWriter writer = new XMLWriter(new FileOutputStream("dorm.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
}
//查询
@Test
public void find() throws Exception{
//1.获取解析器
SAXReader reader = new SAXReader();
//2.解析xml获取代表整个文档的dom对象
Document dom = reader.read("dorm.xml");
//3.获取根节点
Element root = dom.getRootElement();
//4.获取根元素下所有的子元素
List
rmlist = root.elements();
//5.获取第二个室友
Element rmEle = rmlist.get(1);
//6.输出
System.out.println(rmEle.element("姓名").getText());
}
//属性类似上面操作
@Test
public void attr() throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read("dorm.xml");
Element root = dom.getRootElement();
Element rmEle = root.element("室友");
// rmEle.addAttribute("特征", "xx");
// String str = rmEle.attributeValue("特征");
// System.out.println(str);
Attribute attr = rmEle.attribute("特征");
attr.getParent().remove(attr);
//更新文档
XMLWriter writer = new XMLWriter(new FileOutputStream("dorm.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
}
}