一、简介
1、dom4j是一个组织,针对xml解析,提供dom4j解析器
2、dom4j不是属于javase的一部分,使用时的做法:导入dom4j提供的jar包。–创建一个文件夹,通常命名为lib,然后将jar包复制到lib下,右击jar包,build path—add to buildpath,看到jar包变成奶瓶的样子,表示导入成功。
3.dom4j也是形成dom4j树进行解析,但是集合了之前的两种方式优点
4.得到document
SAXReader reader=new SAXReader();
Document document=reader.read(url);
5、document 的父接口是Node,如果在document里面找不到要用的方法,去他的父类里面找。
document里面的方法,getRootElement();获取的根节点,返回的是Element,Element也是一个接口,其父接口也是Node。
getParent();获取父节点
addElement();添加标签
二、使用dom4j查询xml
1、查询所有那么元素
首先创建解析器,接着获取document,得到根节点,getRootElement,返回的是Element,得到所有的p1标签,
element(qname):获取标签下面的第一个字标签,qname标签的名称
elements(qname):获取标签下的所有字标签(第一层字标签)
element():获取标签下面的所有字标签
得到name,得到name里面的值
(注意导包的时候,要导正确)
package sax;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Test4j {
public static void main(String[] args) throws Exception {
select1();
}
public static void select1() throws Exception {
SAXReader saxReader=new SAXReader();
Document document=saxReader.read("src/p1.xml");
Element root=document.getRootElement();
List<Element> list=root.elements("p1");
//遍历list
for (Element element : list) {
Element name1=element.element("name");
String s=name1.getText();
System.out.println(s);
}
}
}
2、查询第一个name 值,这时只需要在获取的p1的时候,用root.element("p1");
获取第一个p1即可。然后再获取第一个name
3、获取第二个p1的第一个name值。
得到所有的p1,这时返回一个list,然后通过list的下标来获取第二个p1,list.get(index)
List<Element> list=root.elements("p1");
Element p2=list.get(1);
Element name=p2.element("name");
String s = p2.getText();
System.out.println(s);
3.使用dom4j实现添加操作
在第一个p1标签末尾添加一个元素<sex>nv</sex>
步骤:创建解析器,获得document,得到根节点,得到第一个p1标签(使用element方法),在p1下面添加元素(在p1上面直接使用addElement(“标签名称”)方法,返回一个Element),在添加完成之后的元素上面添加文本(在sex上直接使用sexText(“文本内容”)方法),回写到xml中,格式化OutputFormat,使用creatprettyPrint方法,获得一个漂亮的格式,使用XMLWriter直接new这个类,传递两个参数(第一个参数:xml文件路径,new FileOutputStream(“路径”),第二个参数:格式化类的值)
package sax;
import java.io.FileOutputStream;
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;
public class Testdom4j {
public static void main(String[] args) throws Exception {
addNode();
}
public static void addNode() throws Exception{
SAXReader saxReader=new SAXReader();
Document document = saxReader.read("src/p1.xml");
Element root=document.getRootElement();
Element p1=root.element("p1");
Element sex1=p1.addElement("sex");
sex1.addText("nv");
//回写到xml中
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/p1.xml"),format);
xmlWriter.write(document);
xmlWriter.close();
}
}
4、在指定位置添加元素
在第一个p1下面的age标签之前添加<school>zhenghang</school>
步骤:(1)创建解析器 (2)获得document (3) 获取根节点,获得第一个p1(4)获得p1下面的所有元素,使用elements方法,返回List,使用list里面的方法,在特定位置添加元素即add()方法,使用之前创建元素,创建文本。add(index,element)第一个是要在哪里之前插入,第二个是元素名称。(5)回写到xml中。
package sax;
import java.io.FileOutputStream;
import java.util.List;
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;
public class Test4 {
public static void main(String[] args) throws Exception {
addCertain();
}
public static void addCertain() throws Exception {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/p1.xml");
Element root = document.getRootElement();
Element p1 = root.element("p1");
List<Element> list = p1.elements();
//创建标签
Element school = DocumentHelper.createElement("school");
school.setText("zhenghang");
list.add(1, school);
//回写到xml中
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/p1.xml"),format);
xmlWriter.write(document);
xmlWriter.close();
}
}
5、方法的封装
得到document和回写到xml进行封装成方法,把传递的文件路径封装成一个常量。
package sax;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jUtils {
public static final String PATH="src/p1.xml";
public static Document getDocument(String path) {
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(path);
return document;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void xmlWriters(String path,Document document) {
try {
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path),format);
xmlWriter.write(document);
xmlWriter.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
封装的好处:提高开发效率,提高代码的可维护性。(比如修改路径,只需要修改常量就可以,而不用对其他代码进行更改)
6、修改元素的值
修改第一个p1中age的值
package sax;
import org.dom4j.Document;
import org.dom4j.Element;
public class Test4jj {
public static void main(String[] args) {
modify();
}
public static void modify() {
Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
Element root = document.getRootElement();
Element p1 = root.element("p1");
//element 获得的是你写的标签的名字中的第一个,不在乎name和age的位置
Element age = p1.element("age");
//修改age的值,setText()可以设置age值,也可以修改age值
age.setText("50");
//回写到文件中
Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document);
}
}
补:ctrl+shift+o快速导包
7.删除元素
删除school
注意:通过父节点进行删除remove(Element args0),返回值是boolean类型
获取p1,获取p1下面的school,通过p1删除school
Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
Element root = document.getRootElement();
Element p1 = root.element("p1");
Element sch = p1.element("school");
p1.remove(sch);
Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document);
8.获取属性值
增删改需要回写,查询不需要回写。
获取第一个p1的id1属性值通过attributeValue(“属性名称”)方法来实现,返回值是String。
<person>
<p1 id1="aaa">
<name>zhangsan</name>
<age>50</age>
<sex>nv</sex>
</p1>
</person>
Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
Element root = document.getRootElement();
Element p1 = root.element("p1");
String s=p1.attributeValue("id1");
System.out.println(s);