文章目录
1 dom4j的简介
dom4j是一个组织,针对xml解析,提供解析器dom4j。
dom4j不是javase的一部分,想要使用:
第一步需要导入dom4j提供jar包
得到Document
public class SAXReader extends java.lang.Object
SAXReader reader = new SAXReader();
Document document = reader.read(url);
Document的父接口是Node
|——如果在Document里面找不到想要的方法,到Node里面找。
方法 | 描述 |
---|---|
public Element getRootElement() | 获取根节点,返回Element |
Element也是一个接口,父接口是Node
方法 | 描述 |
---|---|
public Element getParent() | 获取父节点 |
public Element addElement | 添加标签 |
public Element element(qName) | 表示获取标签下面的第一个子标签,qName指标签的名称 |
public List elements(qName) | 表示获取标签下面的所有子标签(一层),qName指标签的名称 |
public List elements() | 表示获取标签下面的所有子标签(一层) |
2 使用dom4j实现查询xml操作
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1 id1="love">
<name>lks</name>
<age>30</age>
</p1>
<p1>
<name>hhy</name>
<age>20</age>
</p1>
</person>
查询所有name元素里面的值。
(1)创建解析器。
(2)得到一个Document
(3)得到根节点
(4)得到所有的p1标签:使用elements(qName)方法返回所有list集合,然后遍历list得到每一个p1。
(5)得到name:在p1下执行element(qName)方法,返回Element
(6)得到name里面的值:getText()方法得到值
public static void allName() throws Exception{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/dom4jlearn/person.xml");
Element root = document.getRootElement();
List<Element> p1 = root.elements("p1");
for(Element e : p1) {
Element name = e.element("name");
String str = name.getText();
System.out.println(str);
}
}
查询第一个name元素的值。
(1)创建解析器。
(2)得到一个Document
(3)得到根节点
(4)得到第一个p1元素
(5)得到p1下面的name元素
(6)得到name元素里面的值
public static void getFirstName() throws Exception{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/dom4jlearn/person.xml");
Element root = document.getRootElement();
Element p1 = root.element("p1");
Element name = p1.element("name");
System.out.println(name.getText());
}
查询第二个name元素的值。
(1)创建解析器。
(2)得到一个Document
(3)得到根节点
(4)得到所有p1元素
(5)遍历得到第二个p1
(6)得到第二个p1下面的name元素
(7)得到name元素里面的值
public static void getSecondName()throws Exception{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/dom4jlearn/person.xml");
Element root = document.getRootElement();
List<Element> p1 = root.elements("p1");
Element name = p1.get(1).element("name");
System.out.println(name.getText());
}
3 使用dom4j实现在末尾添加节点
在第一个p1标签末尾添加一个元素<sex>女</sex>
。
(1)创建解析器。
(2)得到一个Document
(3)得到根节点
(4)获取到第一个p1:使用element()方法
(5)在p1下面添加元素:使用p1.addElement(“sex”)方法,返回一个Element
(6)在添加完成之后的元素下面添加文本:在sex上使用setText(“文本内容”)方法
(7)回写xml:格式化(OutputFormat),使用createPrettyPrint(),使用XMLWriter,直接new,传两个参数,第一个参数是xml路径,第二个参数是格式化类的值。之后使用write()回写
public static void addSex() throws Exception{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/dom4jlearn/person.xml");
Element root = document.getRootElement();
Element p1 = root.element("p1");
Element sex = p1.addElement("sex");
sex.setText("女");
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/dom4jlearn/person.xml"), format);
xmlWriter.write(document);
}
4 使用dom4j实现在特定位置添加元素
在第一个p1下面的age标签之前添加<school>fjut</school>
(1)创建解析器。
(2)得到一个Document
(3)得到根节点
(4)获取到第一个p1
(5)获取p1下所有的元素:elements()方法,返回List集合
(6)使用List里面的方法add(int index, E element),在特定位置添加元素
|——使用DocumentHelper.createElement()创建元素,在下面创建文本。
(7)回写xml
```java
public static void addSchool() throws Exception{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(PATH);
Element root = document.getRootElement();
Element p1 = root.element("p1");
List<Element> list = p1.elements();
Element school = DocumentHelper.createElement("school");
school.setText("fjut");
list.add(1, school);
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(PATH), format);
xmlWriter.write(document);
}
# 5 dom4j里面封装方法的操作
可以对得到document的操作和回写xml操作,封装成方法,也可以把传递的文件路径,封装成一个常量,好处是可以提高开发速度,可以提高代码可维护性。
1、返回document:public static Document getDocument(String path)
2、回写xml:public static void xmlWriters(String path, Document document);
```java
public final static String PATH = "src/dom4jlearn/person.xml";
public static Document getDocument() {
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read(PATH);
return document;
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void xmlWriters(Document document) {
try {
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(PATH), format);
xmlWriter.write(document);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
6 使用dom4j实现修改节点的操作
修改第一个p1下面的age元素的值<age>30</age>
(1)得到document
(2)得到第一个p1元素
(3)得到第一个p1下面的age
(4)修改值为30
(5)回写xml
public static void modifyAge() {
Document document = Dom4jUtils.getDocument();
Element root = document.getRootElement();
Element p1 = root.element("p1");
Element age = p1.element("age");
age.setText("300");
Dom4jUtils.xmlWriters(document);
}
7 使用dom4j实现删除节点的操作
删除第一个p1下的<school>fjut</school>
(1)得到document
(2)获取根节点
(3)获取第一个p1标签
(4)得到第一个p1下的school元素
(5)使用p1删除school元素
(6)回写xml
public static void removeSchool() {
Document document = getDocument();
Element root = document.getRootElement();
Element p1 = root.element("p1");
Element school = p1.element("school");
p1.remove(school);
xmlWriters(document);
}
8 使用dom4j实现获取属性值的操作
获取第一个p1里面的属性id1的值。
(1)得到document
(2)获取根节点
(3)获取第一个p1元素
(4)获取第一个p1元素的属性值,public String attributeValue(String attribute);
public static void getAttribute() {
Document document = getDocument();
Element root = document.getRootElement();
Element p1 = root.element("p1");
System.out.println(p1.attributeValue("id1"));
}