目录
java基础之
是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。本篇文章重点介绍DOM4J对 文件的一些操作。
1. 解析概述
常见解析方式和解析器
- DOM:要求解析器把整个 文档装载到内存,并解析成一个Document对象。
优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
缺点: 文档过大,可能出现内存溢出显现。
- SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。
优点:处理速度快,可以处理大文件
缺点:只能读,逐行后将释放资源。
2. DOM4J介绍
2.1 常用包
| 包名 | 作用 |
|---|---|
| import org.dom4j.Document; | Document文档类 |
| import org.dom4j.Element | 元素节点类 |
| import org.dom4j.QName; | 一个对元素名字的封装类 |
| import org.dom4j.io.SAXReader; | sax读取类 |
| import org.dom4j.io. Writer | 写入类 |
| import org.dom4j.io.OutputFormat | 输出格式 |
2.2 内置元素
| 元素 | 含义 |
|---|---|
| Attribute | 定义了 的属性。 |
| Branch | 指能够包含子节点的节点。如 元素(Element)和文档(Docuemnts)定义了一个公共的行为 |
| CDATA | 定义了 CDATA 区域 |
| CharacterData | 是一个标识接口,标识基于字符的节点。如CDATA,Comment, Text. |
| Comment | 定义了 注释的行为 |
| Document | 定义了 文档 |
| DocumentType | 定义 DOCTYPE 声明 |
| Element | 定义 元素 |
| ElementHandler | 定义了Element 对象的处理器 |
| ElementPath | 被 ElementHandler 使用,用于取得当前正在处理的路径层次信息 |
| Entity | 定义 entity |
| Node | 为dom4j中所有的 节点定义了多态行为 |
| NodeFilter | 定义了在dom4j 节点中产生的一个滤镜或谓词的行为(predicate) |
| ProcessingInstruction | 定义 处理指令 |
| Text | 定义 文本节点 |
| Visitor | 用于实现 Visitor模式 |
| XPath | 在分析一个字符串后会提供一个 XPath 表达式 |
2.2 Element类
| 方法 | 含义 |
|---|---|
| getQName() | 元素的QName对象 |
| getNamespace() | 元素所属的Namespace对象 |
| getNamespacePrefix() | 元素所属的Namespace对象的prefix |
| getNamespaceURI() | 元素所属的Namespace对象的URI |
| getName() | 元素的local name |
| getQualifiedName() | 元素的qualified name |
| getText() | 元素所含有的text内容,如果内容为空则返回一个空字符串而不是null |
| getTextTrim() | 元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null |
| attributeIterator() | 元素属性的iterator,其中每个元素都是 |
2.3 Attribute类
| 方法 | 含义 |
|---|---|
| attributeValue() | 元素的某个指定属性所含的值 |
| elementIterator() | 元素的子元素的iterator,其中每个元素都是Element对象 |
| element() | 元素的某个指定(qualified name或者local name)的子元素 |
| elementText() | 元素的某个指定(qualified name或者local name)的子元素中的text信息 |
| getParent() | 元素的父元素 |
| getPath() | 元素的XPath表达式,其中父元素的qualified name和子元素的qualified name之间使用”/”分隔 |
| isTextOnly() | 是否该元素只含有text或是空元素 |
| isRootElement() | 是否该元素是 树的根节点 |
2.4 常用操作
- 读取 文件,获得document对象.
SAXReader reader = new SAXReader();
Document document = reader.read(new File(\"***. \"));
- 解析 形式的文本,得到document对象.
String text = \"<members></members>\";
Document document = DocumentHelper.parseText(text);
- 获取根节点
Element root = dom.getRootElement();
- 取得某节点的单个子节点
Element memberElm=root.element(\" \");
- 获取节点文字
String text=memberElm.getText();
- 取得某节点下名为\" \"所有字节点并进行遍历
List list = rootElm.elements(\"member\");
Iterator<Element> it = list.iterator();
while(it.hasNext()){
Element elm = it.next();
// do something...
}
- 在某节点下添加子节点.
Element ageElm = newMemberElm.addElement(\"age\");
- 设置节点文字.
ageElm.setText(\"29\");
- 删除某节点.
parentElm.remove(childElm);
- 取得某节点下的某属性
Element root=document.getRootElement();
Attribute attribute=root.attribute(\"id\");
- 设置某节点的属性和文字.
newMemberElm.addAttribute(\"name\", \"sitinspring\");
- 设置属性的文字
Attribute attribute=root.attribute(\"name\");
attribute.setText(\"sitinspring\");
- 删除某属性
Attribute attribute=root.attribute(\"size\");// 属性名name
root.remove(attribute);
3. 代码演示
3.1 DOM4J读取 文件
test.
<? version=\"1.0\" encoding=\"UTF-8\"?>
<bookstore>
<book id=\"1\">
< >巴黎圣母院</ >
<author>雨果</author>
</book>
<book id=\"2\">
< >飘</ >
<author>米切尔</author>
</book>
</bookstore>
1. 使用List列表解析
import java.io.File;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
File file = new File(\"test. \");
Document document = reader.read(file);
Element root = document.getRootElement();
List<Element> childElements = root.elements();
for (Element child : childElements) {
//已知属性名情况下
System.out.println(\"--->id: \" + child.attributeValue(\"id\"));
System.out.println(\" :\" + child.elementText(\" \"));
System.out.println(\"author:\" + child.elementText(\"author\"));
//未知属性名情况下
/*List<Attribute> attributeList = child.attributes();
for (Attribute attr : attributeList) {
System.out.println(attr.getName() + \": \" + attr.getValue());
}
List<Element> elementList = child.elements();
for (Element ele : elementList) {
System.out.println(ele.getName() + \": \" + ele.getText());
}
System.out.println();*/
}
}
}
//输出结果:
--->id: 1
:巴黎圣母院
author:雨果
--->id: 2
:飘
author:米切尔
2. 使用Iterator解析
public class Demo {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(\"test. \"));
Element root = document.getRootElement();
Iterator<Element> it = root.elementIterator();
while (it.hasNext()) {
Element element = it.next();
//未知属性名称情况下
Iterator<Element> attrIt = element.attributeIterator();
while (attrIt.hasNext()) {
Attribute a = (Attribute) attrIt.next();
System.out.println(a.getValue());
}
Iterator<Element> eleIt = element.elementIterator();
while (eleIt.hasNext()) {
Element e = eleIt.next();
System.out.println(e.getName() + \": \" + e.getText());
}
System.out.println();
//已知元素名情况下
/*System.out.println(\"id: \" + element.attributeValue(\"id\"));
System.out.println(\" : \" + element.elementText(\" \"));
System.out.println(\"author: \" + element.elementText(\"author\"));
System.out.println();*/
}
}
}
//输出结果:
id: 1
:巴黎圣母院
author:雨果
id: 2
:飘
author:米切尔
3.2 DOM4J创建 文件
public class Demo {
public static void main(String[] args) throws Exception {
Document doc = DocumentHelper.createDocument();
//增加根节点
Element books = doc.addElement(\"bookstore\");
//增加子元素
Element book1 = books.addElement(\"book\");
Element 1 = book1.addElement(\" \");
Element author1 = book1.addElement(\"author\");
Element book2 = books.addElement(\"book\");
Element 2 = book2.addElement(\" \");
Element author2 = book2.addElement(\"author\");
//为子节点添加属性
book1.addAttribute(\"id\", \"3\");
//为元素添加内容
1.setText(\"战争与和平\");
author1.setText(\"列夫托尔斯泰\");
book2.addAttribute(\"id\", \"4\");
2.setText(\"红楼梦\");
author2.setText(\"曹雪芹\");
//实例化输出格式对象
OutputFormat format = OutputFormat.createPrettyPrint();
//设置输出编码
format.setEncoding(\"UTF-8\");
//创建需要写入的File对象
File file = new File(\"test2. \");
//生成 Writer对象,构造函数中的参数为需要输出的文件流和格式
Writer writer = new Writer(new FileOutputStream(file), format);
//开始写入,write方法中包含上面创建的Document对象
writer.write(doc);
}
}
运行结果(项目根目录下):
<? version=\"1.0\" encoding=\"UTF-8\"?>
<bookstore>
<book id=\"3\">
< >战争与和平</ >
<author>列夫托尔斯泰</author>
</book>
<book id=\"4\">
< >红楼梦</ >
<author>曹雪芹</author>
</book>
</bookstore>
3.2 DOM4J修改 文件
public class Deml {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
File file = new File(\"test. \");
Document document = reader.read(file);
Element root = document.getRootElement();
Element nameElement = root.element(\"book\").element(\"author\");
nameElement.setText(\"鲁迅\");
//写回 文档
OutputFormat format = OutputFormat.createPrettyPrint();
Writer writer = new Writer(new FileOutputStream(\"test. \"), format);
writer.write(document);
writer.close();
}
}
运行结果(项目根目录下):
<? version=\"1.0\" encoding=\"UTF-8\"?>
<bookstore>
<book id=\"1\">
< >巴黎圣母院</ >
<author>鲁迅</author>
</book>
</bookstore>
继续阅读与本文标签相同的文章
-
DBengine 排名第一,云数据库 InfluxDB 版正式商业化!
2026-05-19栏目: 教程
-
阿里有个超神秘的组织,CEO们来了都要翻牌 | 开发者必读(056期)
2026-05-19栏目: 教程
-
云原生计算重塑企业IT架构 - 分布式应用架构
2026-05-19栏目: 教程
-
阿里云创新大会再出发,一些变化即将发生
2026-05-19栏目: 教程
-
阿里云的包年包月、按量付费、抢占式实例计费方式是什么,如何选择
2026-05-19栏目: 教程
