目录
2.2 Dom4jDemo1类,实现用List的方式解析xml
3.2 Dom4jDemo2类,实现用Iterator的方式解析xml
4.2 Dom4jDemo3类,创建xml文件,并往文件中写入内容
【写在前面】
在之前的练习中,使用到了dom4j来解析xml文件。这里单独起一篇文章,再次练习dom4j的简单用法。前文:Java练习(十八):编写代码,简单模拟Spring容器管理实例
参考该文章,自己手动编写了一遍代码,推荐看原博:java中采用dom4j解析xml文件
1. Dom4j知识点
1.1 什么是Dom4j
dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。
1.2 API接口
1.3 常见API
1)class org.dom4j.io.SAXReader
read 提供多种读取xml文件的方式,返回一个Domcument对象
2)interface org.dom4j.Document
iterator 使用此法获取node
getRootElement 获取根节点
3)interface org.dom4j.Node
getName 获取node名字,例如获取根节点名称为bookstore
getNodeType 获取node类型常量值,例如获取到bookstore类型为1——Element
getNodeTypeName 获取node类型名称,例如获取到的bookstore类型名称为Element
4)interface org.dom4j.Element
attributes 返回该元素的属性列表
attributeValue 根据传入的属性名获取属性值
elementIterator 返回包含子元素的迭代器
elements 返回包含子元素的列表
5)interface org.dom4j.Attribute
getName 获取属性名
getValue 获取属性值
6)interface org.dom4j.Text
getText 获取Text节点值
7)interface org.dom4j.CDATA
getText 获取CDATA Section值
8)interface org.dom4j.Comment
getText 获取注释
2. 示例一:用List方式来解析xml
2.1 .xml文件
<?xml version="1.0" encoding="UTF-8"?>
<config>
<database id="1">
<url>127.0.0.1</url>
<port>8080</port>
<login>Sheryl</login>
<password>123</password>
</database>>
<database id="2">
<url>127.0.0.2</url>
<port>8088</port>
<login>Kate</login>
<password>456</password>
</database>>
</config>
2.2 Dom4jDemo1类,实现用List的方式解析xml
package com.my.demo;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
//用list方式来解析xml
public class Dom4jDemo1 {
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader(); //创建dom4j解析器
Document document = reader.read(new File("C:\\Users\\pearl\\Desktop\\road\\2022\\conFile\\demo.xml")); //加载document对象
Element root = document.getRootElement(); //拿到根节点
List<Element> childrenElements = root.elements(); //拿到所有子节点
for(Element child: childrenElements){
//情况1: 不知道节点的属性名
List<Attribute> attributeList = child.attributes();
for(Attribute attr: attributeList){
System.out.println(attr.getName() + ":" + attr.getValue());
}
System.out.println("---------------");
//情况2:知道节点的属性名
// System.out.println("id: " + child.attributeValue("id"));
//情况3:不知道子元素名
List<Element> elementList = child.elements();
for(Element ele: elementList){
System.out.println(ele.getName() + ":" + ele.getText());
}
System.out.println("************************************************************");
//情况4:知道子元素名
// System.out.println("URL: " + child.elementText("url"));
// System.out.println("PORT: " + child.elementText("port"));
// System.out.println("LOGIN: " + child.elementText("login"));
// System.out.println("PASSWORD: " + child.elementText("password"));
}
}
}
运行结果:
id:1
---------------
url:127.0.0.1
port:8080
login:Sheryl
password:123
************************************************************
id:2
---------------
url:127.0.0.2
port:8088
login:Kate
password:456
************************************************************Process finished with exit code 0
3. 示例二:使用Iterator迭代器的方式来解析xml
3.1 .xml文件
同上,略
3.2 Dom4jDemo2类,实现用Iterator的方式解析xml
package com.my.demo;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.Iterator;
import java.util.List;
public class Dom4jDemo2 {
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader(); //创建dom4j解析器
Document document = reader.read(new File("C:\\Users\\pearl\\Desktop\\road\\2022\\conFile\\demo.xml")); //加载document对象
Element root = document.getRootElement(); //拿到根节点
Iterator iterator = root.elementIterator(); //拿到所有子节点
while (iterator.hasNext()){
Element element = (Element) iterator.next();
//情况1: 不知道节点的属性名
Iterator attrIt = element.attributeIterator();
while (attrIt.hasNext()){
Attribute a = (Attribute) attrIt.next();
System.out.println(a.getValue());
}
//情况2:知道节点的属性名
// System.out.println("id:" + element.attributeValue("id"));
System.out.println("---------------");
//情况3:不知道子元素名
Iterator eleIt = element.elementIterator();
while (eleIt.hasNext()){
Element e = (Element) eleIt.next();
System.out.println(e.getName() + ": " + e.getText());
}
//情况4:知道子元素名
// System.out.println("URL: " + element.elementText("url"));
// System.out.println("PORT: " + element.elementText("port"));
// System.out.println("LOGIN: " + element.elementText("login"));
// System.out.println("PASSWORD: " + element.elementText("password"));
System.out.println("************************************************************");
}
}
}
运行结果:
1
---------------
url: 127.0.0.1
port: 8080
login: Sheryl
password: 123
************************************************************
2
---------------
url: 127.0.0.2
port: 8088
login: Kate
password: 456
************************************************************Process finished with exit code 0
4. 示例三:创建xml文件,并往文件中写入内容
4.1 .xml文件
同上,略
4.2 Dom4jDemo3类,创建xml文件,并往文件中写入内容
package com.my.demo;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.*;
public class Dom4jDemo3 {
public static void main(String[] args) throws IOException {
Document doc = DocumentHelper.createDocument();
//增加根节点
Element root = doc.addElement("config");
//增加子节点
Element database1 = root.addElement("database");
Element url1 = database1.addElement("url");
Element port1 = database1.addElement("port");
Element login1 = database1.addElement("login");
Element password1 = database1.addElement("password");
Element database2 = root.addElement("database");
Element url2 = database2.addElement("url");
Element port2 = database2.addElement("port");
Element login2 = database2.addElement("login");
Element password2 = database2.addElement("password");
//在上面创建的子节点中添加具体属性
database1.addAttribute("id", "3");
url1.setText("127.0.0.1");
port1.setText("8081");
login1.setText("Sheryl666");
password1.setText("123456");
database2.addAttribute("id", "4");
url2.setText("127.0.0.1");
port2.setText("8082");
login2.setText("Kate666");
password2.setText("654321");
//实例化输出格式对象
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
//设置输出编码
outputFormat.setEncoding("UTF-8");
//创建需要写入的File对象
File file = new File("C:\\Users\\pearl\\Desktop\\road\\2022\\conFile\\demo2.xml");
//生成XMLWriter对象
XMLWriter xmlFile = new XMLWriter(new FileOutputStream(file), outputFormat);
//将xml内容写入文件
xmlFile.write(doc);
}
}
运行结果,生成demo2.xml文件,内容如下:
补充:Maven项目下,pom.xml中添加dom4j依赖,如下:
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>