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

特殊xml处理