解析XML文件的主流技术包括:DOM、JDOM、SAX和DOM4J;
DOM4J是一个十分优秀的开源框架(易用、开源)。使用比较广泛, SUN的JAXM也在用DOM4J, Hibernate用它来读写配置文件等。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。DOM4J的使用非常简单,在使用的过程中,只需要通过查询帮助文档和相关的技术博客即可完成常规的操作。【当XML文档较大且不考虑平台移植性时,建议采用DOM4J】
这里简单介绍DOM4J对XML文件内容的解析和对XPath的支持。
1、迭代方式解析XML文件内容及标签属性
private static void readNodes(Element node){
//首先获取当前节点的所有属性
List<Attribute> list = node.attributes();
//遍历节点属性
for(Attribute attribute : list){
System.out.print("\n");
System.out.println("属性-"+attribute.getName() +":" + attribute.getValue());
}
//输出当前节点下的内容
if(!(node.getTextTrim().equals(""))){
System.out.println( node.getName() + ":" + node.getText());
}
//迭代当前节点下面的所有子节点
Iterator<Element> iterator = node.elementIterator();
while(iterator.hasNext()){
Element e = iterator.next();
readNodes(e);
}
}
2、对XPath的支持,直接读取指定标签下的值(name和age)需要引入jaxen-xx-xx.jar,否则会报java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常
private static void readNodesByXPath(Document document){
List list = document.selectNodes("/students/student/name");
for (int i = 0; i < list.size(); i++) {
Element node = (Element) list.get(i);
System.out.println(node.getName()+"-"+node.getTextTrim());
}
System.out.println("----------------------------------------");
List list2 = document.selectNodes("/students/student/age");
for (int i = 0; i < list2.size(); i++) {
Element node = (Element) list2.get(i);
System.out.println(node.getName()+"-"+node.getTextTrim());
}
}
3、项目中有时会遇到一种情况,要求请求的入参(XML)格式比复杂,但有效的参数就几个( 首先编辑好XML待用,然后读取并添加有效参数即可,接下来以student.xml为例,添加参数)
private static void addAndUpdateXml(Document document) {
//XPath查找param1和param2节点
Node node = document.selectSingleNode("/students/student/param1");
node.setText("1");
Node node2 = document.selectSingleNode("/students/student/param2");
node2.setText("2");
System.out.println(document.asXML());
}
4、代码调用测试方法
读写XML文档主要依赖于org.dom4j.io包,其中提供了DOMReader和SAXReader两类不同方式。因为利用了相同的接口,所以他们的调用方式是相同的。
public static void main(String[] args) throws Exception {
ReadXml();
}
public static void ReadXml() throws Exception{
//1.创建SAXReader对象
SAXReader reader = new SAXReader();
//2.读取文件
InputStream ins = Thread.currentThread().getContextClassLoader().getResourceAsStream("students.xml");
if(ins == null){
throw new Exception("获取文件失败或文件不存在!");
}
Document document = reader.read(ins);
//3.获取根节点元素对象
Element root = document.getRootElement();
//解析 - 遍历
readNodes(root);
//解析 - XPath读取指定标签下的值
readNodesByXPath(document);
//读取xml文件,添加和更改数值
addAndUpdateXml(document);
}
分析:代码片段中为读取项目源文件路径下的students.xml文件;SAXReader的read方法是重载的,可以从InputStream, File, Url等多种不同的源读取,得到的Document对象就代表了整个XML。一切XML解析都是从Root元素开始的,所以首先通过Document获取Root
5、student.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id='0001'>
<name>stu01</name>
<age>20</age>
<sex>男</sex>
<param1></param1>
</student>
<student id='0002'>
<name>stu02</name>
<age>22</age>
<sex>女</sex>
<param2></param2>
</student>
</students>