【高级编程】XML DOM4J解析XML文件(含案例)
文章目录
- DOM4J
- DOM4J 解析 XML
- 读取
- 修改
- 添加
- 删除
XML(EXtensible Markup Language),可扩展标记语言。一种用于存储和传输数据的标记语言。XML 与操作系统、编程语言的开发平台无关。实现不同系统之间的数据交换。
作用:数据交互;配置应用程序和网站;Ajax基石
<!-- 声明 -->
<?xml version="1.0" encoding="UTF-8"?>
<books>
<!-- 文档元素描述信息(文档结构) -->
<!-- 图书信息 -->
<book id="bk101">
<author>王珊</author>
<title>.NET高级编程</title>
<description>包含C#框架和网络编程等</description>
</book>
<book id="bk102">
<author>李明明</author>
<title>XML基础编程</title>
<description>包含XML基础概念和基本作用</description>
</book>
</books>
XML 文档内容由一系列标签元素组成
<元素名 属性名 = "属性值">元素内容</元素名>
-
属性值用双引号包裹
-
一个元素可以有多个属性
-
属性值中不能直接包含:
< " &
-
不建议使用的字符:
' >
<!-- 空元素 -->
<name> </name>
<name></name>
<name/>
XML 编写注意事项
-
所有XML 元素都必须有结束标签
-
XML 标签对大小写敏感
-
XML 必须正确的嵌套
-
同级标签以缩进对齐
-
元素名称可以包含字母、数字或其他的字符
-
元素名称不能以数字或者标点符号开始
-
元素名称中不能含空格
属性命名空间
<?xml version="1.0" encoding="UTF-8"?>
<batchCompany xmlns="http://www.Aptech_edu.ac"
xmlns:tea="http://www.tea.org">
<batch-list>
<batch type="thirdbatch">第三批次</batch>
<batch tea:type="thirdbatch">第三批次</batch>
<batch>午班批次</batch>
</batch-list>
</batchCompany>
除非带有前缀,否则属性属于所属的元素的命名空间
DOM
文档对象模型 ( Document Object Model ) 。DOM 把 XML 文档映射成一个倒挂的树。
DOM解析包:org.w3c.dom
常用接口 | 常用方法 | 说明 |
---|---|---|
Document:表示整个 XML 文档 | NodeList getElementsByTagName(String Tag) | 按文档顺序返回文档中指定标记名称的所有元素集合 |
Element createElement(String tagName) | 创建指定标记名称的元素 | |
Node:该文档树中的单个节点 | NodeList getChildNodes() | 获取该元素的所有子节点,返回节点集合 |
Element:XML 文档中的一个元素 | String getTagName() | 获取元素名称 |
DOM4J
DOM4J(Document Object Model for XML in Java)是一个简单、轻量级的Java库,用于处理XML文档。它提供了一种方式来读取、修改和写入XML文件。
在 DOM4J 中,这些类是构成XML文档的基本组成部分,它们共同构成了DOM4J的核心模型:
Document
类:代表整个XML文档。每个 XML 文档的根元素就是Document
对象的子对象Element
类:代表XML文档中的元素节点。每个Element
都有名称,可以有子元素、文本内容及属性Text
类:表示XML文档中的文本节点。Text
节点可以包含在Element
中Attribute
类:代表元素上的属性。在<element attr="value">
中,attr
是属性名,“value”` 是该属性的值
DOM4J 解析 XML
方法 | 描述 | 举例 |
---|---|---|
SAXReader() | 读取 xml 文件 | // 将 xml 文件加载到内存中 XML 解析器 SAXReader saxReader = new SAXReader(); // document 加载执行 xml 文档获取 Document 对象 Document document = saxReader.read(XML路径); |
getRootElement() | 获取 XML 根节点 | Element rootElement = document.getRootElement(); |
elements() | 获取当前节点下所有子节点 | // 获取根节点下所有子节点 List<Element> Elist = rootElement.elements(); |
elements(“节点名”) | 根据指定子元素名,获取元素下所有子节点 | // 获取节点名称为books下所有子节点 List<Element> Elist = rootElement.elements(“books”); |
element(“节点名”) | 根据指定子元素名,获取子元素对象,如果重复,则获取第一个 | //获取节点名称为books下单个子节点 Element element= rootElement.element(“books”); |
setText() | 设置元素文本内容 | newelement.setText(“内容”); |
getText() | 获取当前节点文本内容 | element.getText() |
elementText(“节点名”) | 根据指定子元素名,获取元素中的文本 | e.elementText(“book”) |
attributeValue(“属性名”) | 获取当前节点属性 | e.attributeValue(“name”) |
addElement(“节点名”) | 创建节点Element对象 | Element newelement = rootElement.addElement(“span”); |
addAttribute(“节点属性名”,“属性值”) | 节点添加,修改属性Element对象 | newelement.addAttribute(“type”,“属性值”); |
creatDocument() | 新XML添加Documen对象 | // 创建一个Document对象 Document read = DocumentHelper.createDocument(); |
createPrettyPrint() | 设置XML编码 | // 创建OutputFormat对象,并设置编码集 OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding(“UTF-8”); |
write() | 写入XML文件 | //写入XML文件的位置 以及指定的格式 XMLWriter xmlWriter=new XMLWriter(new FileWriter(“cs.xml”),outputFormat); //开始写入XML文件 写入Document对象 xmlWriter.write(document); xmlWriter.close(); |
我们有两个 XML 文件
【students.xml】
<?xml version="1.0" encoding="UTF-8"?>
<stus>
<stu id="1001">
<name>张三</name>
<age>21</age>
<score value="80"/>
</stu>
<stu id="1002">
<name>李四</name>
<age>19</age>
<score value="92"/>
</stu>
</stus>
【books.xml】
<?xml version="1.0" encoding="UTF-8"?>
<books>
<!--图书信息 -->
<book id="bk101">
<author>王珊</author>
<title>.NET高级编程</title>
<description>包含C#框架和网络编程等</description>
</book>
<book id="bk102">
<author>李明明</author>
<title>XML基础编程</title>
<description>包含XML基础概念和基本作用</description>
</book>
</books>
首先定义类,在 UtilsXml 类中编写公用方法
public class UtilsXml {
static Document document = null;
// 读取文档(用于 读取 修改 删除方法)
public static void info(String path){
try {
//构建解析器
SAXReader saxReader = new SAXReader();
//通过read方法获得doc对象
document = saxReader.read(path);
} catch (DocumentException e) {
throw new RuntimeException(e);
}
}
// 写入文件(用于 修改 添加 删除方法)
public static void OutputXml(String path){
try {
//document 写入
XMLWriter xmlWriter = new XMLWriter(new FileWriter(path));
xmlWriter.write(document);
xmlWriter.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
接下来分别定义读取、修改、添加、删除 XML 的静态方法
读取
public static void showXml(){
try {
info("ch10/students.xml");
//获得根节点
Element root = document.getRootElement();
//打印根节点名称
System.out.println("根节点:"+root.getName());
//获得所有子节点
List<Element> elements = root.elements();
for(Element element : elements){
System.out.println("---------stu--------");
//获得每个子节点上的id属性值
String id = element.attributeValue("id");
System.out.println("id:"+id);
//获得stu下name元素节点
Element name = element.element("name");
System.out.println("name:"+name.getText());
Element age = element.element("age");
System.out.println("age:"+age.getText());
Element score = element.element("score");
System.out.println("score:"+score.attributeValue("value"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
修改
public static void editXml(){
try {
info("ch10/students.xml");
//获得根节点
Element root = document.getRootElement();
List<Element> elementList = root.elements();
for(Element element:elementList){
if("1002".equals(element.attributeValue("id"))){
element.element("name").setText("王五");
}
}
//新增节点
Element stu = root.addElement("stu");
stu.addAttribute("id","1003");
stu.addElement("name").setText("马六");
stu.addElement("age").setText("20");
stu.addElement("score").addAttribute("value","77");
//document 写入students.xml
OutputXml("ch10/students.xml");
} catch (Exception e) {
e.printStackTrace();
}
}
添加
public static void saveXml(){
try {
document = DocumentHelper.createDocument();
// 添加 root 节点 根节点
Element books = document.addElement("books");
Element book1 = books.addElement("book");
book1.addAttribute("id","bk101");
book1.addElement("author").setText("王珊");
book1.addElement("title").setText(".NET高级编程");
Element book2 = books.addElement("book");
book2.addAttribute("id","bk102");
book2.addElement("author").setText("王明明");
book2.addElement("title").setText("XML基础编程");
OutputXml("ch10/books.xml");
} catch (Exception e) {
e.printStackTrace();
}
}
删除
public static void deleteXml(){
try {
info("ch10/books.xml");
Element root = document.getRootElement(); // 获得根节点
List<Element> elementList = root.elements();
for(Element element:elementList){
Element author = element.element("author");
if(author.getText().equals("王明明")){
element.getParent().remove(element);
}
}
OutputXml("ch10/books.xml");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
在 main()
方法中依次调用上述方法
public class UtilsXml {
public static void main(String[] args) {
//showXml(); //读取
//editXml(); //修改
//saveXml(); //添加
deleteXml(); //删除
}
}