Dom4j基本使用
2.1概述
Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j开发,需下载dom4j相应的jar文件。(http://www.dom4j.org/download.html)
2.2 核心接口解读
DOM4J主要接口都在org.dom4j这个包里定义。
-Node为所有的dom4j中XML节点定义了多态行为;
-Branch为能够包含子节点的节点如XML元素(Element)和文档(Document)定义了一个公共的行为;
|-Element 定义XML 元素;
|-Document定义了XML文档;
-DocumentType定义XML DOCTYPE声明;
-Entity定义 XML entity;
-Attribute定义了XML的属性;
-ProcessingInstruction 定义 XML 处理指令;
-CharacterData是一个标识接口,标识基于字符的节点。如CDATA,Comment, Text;
|- CDATA 定义了XML CDATA 区域;
|-Text 定义XML 文本节点;
|- Comment 定义了XML注释的行为;
2.3 CRUD案例
<?xml version="1.0" encoding="UTF-8"?> <学生列表> <学生 学号="001"> <姓名>郭靖</姓名> <性别>男</性别> <年龄>25</年龄> </学生> <学生 学号="002"> <姓名>黄蓉</姓名> <性别>女</性别> <年龄>20</年龄> </学生> </学生列表>
读取节点信息
1)读取所有元素信息
@Test public void testRead1() throws Exception{ //1、创建SAXReader实例 SAXReader reader = new SAXReader(); //2、通过read方法加载XML文档,并获得Document文档对象 Document doc = reader.read("src/student.xml"); //3、获得根元素 Element e = doc.getRootElement(); //4、遍历根元素下面所有子元素 praseChildElement(e); } //遍历指定元素下面的所有子元素 private void praseChildElement(Element e) { System.out.println(e.getName()); //获取元素下面的所有子元素 List<Element> cList = e.elements(); for(Element c:cList){ praseChildElement(c); } }
2)读取指定元素内容
@Test public void testRead2() throws Exception{ //1、创建SAXReader实例 SAXReader reader = new SAXReader(); //2、通过read方法加载XML文档,并获得Document文档对象 Document doc = reader.read("src/student.xml"); //获得第一个学生节点 Element student = (Element) doc.getRootElement().elements("学生").get(0); //获得第一个学生节点下的姓名节点 Element name = student.element("姓名"); //获得姓名节点的内容 System.out.println(name.getText()); }
3)读取属性
@Test public void testRead3() throws Exception{ //1、创建SAXReader实例 SAXReader reader = new SAXReader(); //2、通过read方法加载XML文档,并获得Document文档对象 Document doc = reader.read("src/student.xml"); //获得第一个学生节点 Element student = (Element) doc.getRootElement().elements("学生").get(0); //读取第一个学生节点的学号属性 Attribute attr = student.attribute("学号"); //获得学号的名称和值 System.out.println(attr.getName()+"="+attr.getValue()); }
添加节点信息
@Test public void testAdd1() throws Exception{ //1、创建SAXReader实例 SAXReader reader = new SAXReader(); //2、通过read方法加载XML文档,并获得Document文档对象 Document doc = reader.read("src/student.xml"); //获得第一个学生节点 Element student = (Element) doc.getRootElement().elements("学生").get(0); //在学生节点下添加新的元素 Element newElement = student.addElement("师傅"); //设置元素内容 newElement.setText("江南七怪"); //将内存的XML数据写入到磁盘文件中 //注意:如果文档中含有中文,需要设置写入的编码格式 OutputFormat format = OutputFormat.createPrettyPrint();//有缩进的格式化输出 format.setEncoding("utf-8");//指定XML编码 //1、创建XMLWriter对象,指定写出的文件路径 XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/student.xml")),format); //2、调用writer方法将内存内容写出 writer.write(doc); //3、关闭对象,释放资源 writer.close(); }
修改节点信息
@Test public void testUpdate1() throws Exception{ //1、创建SAXReader实例 SAXReader reader = new SAXReader(); //2、通过read方法加载XML文档,并获得Document文档对象 Document doc = reader.read("src/student.xml"); //获得第一个学生节点 Element student = (Element) doc.getRootElement().elements("学生").get(0); Element age = student.element("年龄"); //修改元素内容 age.setText("30"); //将内存的XML数据写入到磁盘文件中 //注意:如果文档中含有中文,需要设置写入的编码格式 OutputFormat format = OutputFormat.createPrettyPrint();//有缩进的格式化输出 format.setEncoding("utf-8");//指定XML编码 //1、创建XMLWriter对象,指定写出的文件路径 XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/student.xml")),format); //2、调用writer方法将内存内容写出 writer.write(doc); //3、关闭对象,释放资源 writer.close(); }
删除节点信息
@Test public void testDelete1() throws Exception{ //1、创建SAXReader实例 SAXReader reader = new SAXReader(); //2、通过read方法加载XML文档,并获得Document文档对象 Document doc = reader.read("src/student.xml"); //获得第一个学生节点 Element student = (Element) doc.getRootElement().elements("学生").get(0); student.detach();//删除元素 //将内存的XML数据写入到磁盘文件中 //注意:如果文档中含有中文,需要设置写入的编码格式 OutputFormat format = OutputFormat.createPrettyPrint();//有缩进的格式化输出 format.setEncoding("utf-8");//指定XML编码 //1、创建XMLWriter对象,指定写出的文件路径 XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/student.xml")),format); //2、调用writer方法将内存内容写出 writer.write(doc); //3、关闭对象,释放资源 writer.close(); }