博客
关于我
使用Java操作xml文档
阅读量:514 次
发布时间:2019-03-07

本文共 5705 字,大约阅读时间需要 19 分钟。

使用Java操作xml文档

DOM文档对象模型

DOM(Document Object Model)定义了访问和操作XML文档的标准方法。DOM将XML文档转化为树状结构,通过DOM树可以完成对文档中的所有元素的读写操作。

DOM结构概述

在DOM模型中,XML文档被解析为一个Document对象,Document对象下包含多个Element对象。每个Element对象又可能包含子Element对象、Attribute对象或是Text内容。

Dom4j

Dom4j是一个功能强大且易于使用的开源库,专为解析XML设计。它在性能、功能和可用性上具有显著优势。

Dom4j安装和配置

Dom4j可以通过百度搜索找到官方文档地址及安装教程。安装完成后,只需依次使用SAXReader解析XML文件即可。

读取Xml数据

依次使用Dom4j读取并解析XML文件

package com.example;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XmlReader {
public void readXml(String filePath) {
try {
SAXReader reader = new SAXReader();
Document document = reader.read(filePath);
Element root = document.getRootElement();
// 获取所有"employee"节点
List
employees = root.elements("employee");
for (Element employee : employees) {
// 获取employee节点的属性
System.out.println("员工编号:" + employee.attribute("no").getText());
// 获取名称
System.out.println("员工姓名:" + employee.element("name").getText());
// 获取年龄
System.out.println("年龄:" + employee.element("age").getText());
// 获取薪资
System.out.println("薪资:" + employee.element("salary").getText());
// 获取部门信息
Element department = employee.element("department");
System.out.println("部门名称:" + department.element("dname").getText());
System.out.println("部门地址:" + department.element("address").getText());
System.out.println("#################################");
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
XmlReader reader = new XmlReader();
reader.readXml("hr.xml");
}
}

写入Xml数据

通过Dom4j写入XML文件,具体操作如下:

package com.example;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXWriter;
public class XmlWriter {
public void writeXml(String filePath) {
try {
// 解决File读取流程问题
SAXWriter writer = new SAXWriter(new java.io.FileOutputStream(filePath, false), "UTF-8");
Document document = writer.read(new java.io.File("hr.xml"));
Element root = document.getRootElement();
// 创建新员工节点
Element newEmployee = root.addElement("employee");
newEmployee.setAttribute("no", "4233");
// 添加员工信息
newEmployee.addElement("name").setText("x3");
// 添加年龄
newEmployee.addElement("age").setText("22");
// 添加薪资
newEmployee.addElement("salary").setText("3622");
// 添加部门信息
Element department = newEmployee.addElement("department");
department.addElement("dname").setText("会计部");
department.addElement("address").setText("XX大厦-B102");
// 写入文件
writer.write(document);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
XmlWriter writer = new XmlWriter();
writer.writeXml("hr.xml");
}
}

XPath路径表达式

XPath是用于查询和操作XML数据的强大工具。掌握XPath可以极大简化XML数据提取操作。

XPath基础知识

  • 元素选择xpath表达式用于选取文档中指定节点的元素。例如,/hr/employee表示选取hr下直接子元素employee。

  • 属性选择:使用@符号可以获取元素属性。例如,//employee[@no='3309']表示选取no属性为3309的所有employee节点。

  • 节点选择:通用节点选择用*,而具体选择用elementName。例如,//employee表示选取所有employee节点,而*/employee表示选取所有注意下的employee节点。

XPath案例分析

以下是几个常见的XPath表达式示例:

  • 选取所有书店的书籍//bookstore/book

  • 选取拥有特定属性的节点//employee[@no='4233']

  • 选取特定位置的节点/bookstore/book[2]

  • 复合选择//employee[name='x1'] | //employee[name='x2']

XPath代码示例

以下是使用Dom4j进行XPath查询的代码示例:

package com.example;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class XPathTest {
public void xpathTest(String xpathExp) {
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new java.io.File("hr.xml"));
List
nodes = document.selectNodes(xpathExp);
for (Node node : nodes) {
Element emp = (Element) node;
System.out.println("员工编号:" + emp.attributeValue("no"));
System.out.println("员工姓名:" + emp.elementText("name"));
System.out.println("员工年龄:" + emp.elementText("age"));
System.out.println("员工薪资:" + emp.elementText("salary"));
System.out.println("员工部门名称:" + emp.element("department").elementText("dname"));
System.out.println("员工部门地址:" + emp.element("department").elementText("address"));
System.out.println("#################################");
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
XPathTest test = new XPathTest();
// 测试多个xpath表达式
test.xpath("/hr/employee");
test.xpath("//employee");
test.xpath("//employee[salary<4000]");
test.xpath("//employee[name='x1']");
test.xpath("//employee[@no='3309']");
test.xpath("//employee[1]");
test.xpath("//employee[last()]");
test.xpath("//employee[position()<6]");
test.xpath("//employee[3] | //employee[1]");
}
}

希望以上内容能帮助您更好地理解和使用Java操作XML文档。

转载地址:http://chijz.baihongyu.com/

你可能感兴趣的文章
Objective-C实现chudnovsky algorithm楚德诺夫斯基算法(附完整源码)
查看>>
Objective-C实现CIC滤波器(附完整源码)
查看>>
Objective-C实现circle sort圆形排序算法(附完整源码)
查看>>
Objective-C实现CircularQueue循环队列算法(附完整源码)
查看>>
Objective-C实现clearBit清除位算法(附完整源码)
查看>>
Objective-C实现climbStairs爬楼梯问题算法(附完整源码)
查看>>
Objective-C实现cocktail shaker sort鸡尾酒排序算法(附完整源码)
查看>>
Objective-C实现cocktailShakerSort鸡尾酒排序算法(附完整源码)
查看>>
Objective-C实现CoinChange硬币兑换问题算法(附完整源码)
查看>>
Objective-C实现collatz sequence考拉兹序列算法(附完整源码)
查看>>
Objective-C实现Collatz 序列算法(附完整源码)
查看>>
Objective-C实现comb sort梳状排序算法(附完整源码)
查看>>
Objective-C实现combinations排列组合算法(附完整源码)
查看>>
Objective-C实现combine With Repetitions结合重复算法(附完整源码)
查看>>
Objective-C实现combine Without Repetitions不重复地结合算法(附完整源码)
查看>>
Objective-C实现conjugate gradient共轭梯度算法(附完整源码)
查看>>
Objective-C实现connected components连通分量算法(附完整源码)
查看>>
Objective-C实现Connected Components连通分量算法(附完整源码)
查看>>
Objective-C实现Convex hull凸包问题算法(附完整源码)
查看>>
Objective-C实现convolution neural network卷积神经网络算法(附完整源码)
查看>>