Java XML解析
Java 解析XML是一个非常常用的一个需求:
- maven中的pom.xml 配置使用的是xml
- spring 的beans.xml 配置使用的是xml
- android 的非常配置文件也都是使用xml
因此使用xml的频率是非常的高,Java中处理xml的库有
-
DOM 处理
优点:实现 W3C 标准,有多种编程语言支持这种解析方式,并且这种方法本身操作上简单快捷,十分易于初学者掌握。其处理方式是将 XML 整个作为类似树结构的方式读入内存中以便操作及解析,因此支持应用程序对 XML 数据的内容和结构进行修改,
缺点: 由于其需要在处理开始时将整个 XML 文件读入到内存中去进行分析,因此其在解析大数据量的 XML 文件时会遇到类似于内存泄露以及程序崩溃的风险,请对这点多加注意。
适用范围: 小型 XML 文件解析、需要全解析或者大部分解析 XML、需要修改 XML 树内容以生成自己的对象模型
-
SAX 处理
SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题。其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数据解析的需求。由于其不需要将整个 XML 文档读入内存当中,它对系统资源的节省是十分显而易见的,它在一些需要处理大型 XML 文档以及性能要求较高的场合有起了十分重要的作用。支持 XPath 查询的 SAX 使得开发人员更加灵活,处理起 XML 来更加的得心应手。但是同时,其仍然有一些不足之处也困扰广大的开发人员:首先是它十分复杂的 API 接口令人望而生畏,其次由于其是属于类似流解析的文件扫描方式,因此不支持应用程序对于 XML 树内容结构等的修改,可能会有不便之处。
适用范围:大型 XML 文件解析、只需要部分解析或者只想取得部分 XML 树内容、有 XPath 查询需求、有自己生成特定 XML 树对象模型的需求
-
Digester/JAXB
优缺点 : 由于其是在上述两者的基础上衍生出来的工具类,为的是满足将 XML 转换为 JavaBean 的特殊需求,故而没有什么特别明显的优缺点。作为大名鼎鼎的开源框架 Struts 的 XML 解析工具 Digester,为我们带来了将 XML 转换为 JavaBean 的可靠方法。
适用范围 : 有将 XML 文档直接转换为 JavaBean 需求。
使用dom4j 来解析 pom.xml 代码示例
- 引入dom4j 处理包
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
dom4j请使用最新版本 1.6.1, 最新版本解析了很多的bug!
- 准备一个 pom.xml 配置,下面是我自己的工程文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.pangugle</groupId>
<artifactId>pangugle-websites</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>pangugle-websites</name>
<url>http://maven.apache.org</url>
<properties>
<!-- basic configs -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<build.dir>target</build.dir>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.22.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>com.pangugle</groupId>
<artifactId>pangugle-framework</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${lib.dir}/local/pangugle-framework.jar</systemPath>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<optional>true</optional>
</dependency>
</dependencies>
</project>
- Java 代码处理
XML Api 接口说明
- DocumentHelper.parseText(string); //把一个字符串转成xml对象
- Element.elementTextTrim(name); 获取节点信息的字符内容,并去除空字符
- Element.elements("name"); // 获取节点列表
public class Test {
public static void main(String[] args) throws Exception
{
String filepath = "C:/Users/Administrator/Desktop/aaaa.txt";
String content = FileUtils.readFileToString(new File(filepath), StringUtils.UTF8);
Document doc = DocumentHelper.parseText(content);
Element rootElement = doc.getRootElement();
// 获取
String groupid = rootElement.elementTextTrim("groupId");
String artifactId = rootElement.elementTextTrim("artifactId");
System.out.println("groupid = " + groupid + ", artifactid = " + artifactId);
// 获取列表
// dependencies
Element dependencyElementj = rootElement.element("dependencies");
List<?> dependencyElementList = dependencyElementj.elements("dependency");
int len = dependencyElementList.size();
for(int i = 0; i < len; i ++)
{
Element tmp = (Element) dependencyElementList.get(i);
String tmpGroupid = tmp.elementTextTrim("groupId");
String tmpArtifactId = tmp.elementTextTrim("artifactId");
System.out.println("dependency groupid = " + tmpGroupid + ", artifactid = " + tmpArtifactId);
}
}
}
运行结果为
groupid = com.pangugle, artifactid = pangugle-websites
dependency groupid = com.pangugle, artifactid = pangugle-framework
dependency groupid = junit, artifactid = junit