今天用到了对内容量很大的XML文件的解析,顺便记录一下。
关于XML的解析技术网上有很多文章,不再详述。 主要的方式有JDK自带的JAXP(Java API For XML Parser)、JDom、Dom4j等。其中Dom4J是相当灵活的,很多开源框架都基于Dom4J来做XML解析。
底层的解析器主要有两种: DOM、SAX。 其中DOM作为树型结构将文本装载到内存中,适合文本内容比较小的;SAX则按照流的方式扫描,事件触发的方式供你处理,比如遇到某个结点的开始符,结束符,大文本不能一次性装载到内存中,就应该采用SAX方式。
DOM4J利用SAXReader类来读取文件,然后为SAXReader对象设置元素处理解析器ElementHandler,有doStart和doEnd两个方法,分别在遇到元素的开始符号和结束符号时候触发。只需在相应的方法内实现自己的业务逻辑即可。
例子: XML文件结构如下:
view plaincopy to clipboardprint?<?xml version="1.0" encoding="GB2312"?>
<TESTINFO version="1.0">
<UPDATEINFO>
<PARAM_TIMESTAMP>2010-12-22 09:54:09</PARAM_TIMESTAMP>
<CITYINFO_LIST>
<CITYINFO City="591" Name="XYZ" No="334" />
<CITYINFO City="591" Name="BJD" No="335" />
<CITYINFO City="591" Name="UUS" No="390" />
</CITYINFO_LIST>
</UPDATEINFO>
</TESTINFO>
<?xml version="1.0" encoding="GB2312"?>
<TESTINFO version="1.0">
<UPDATEINFO>
<PARAM_TIMESTAMP>2010-12-22 09:54:09</PARAM_TIMESTAMP>
<CITYINFO_LIST>
<CITYINFO City="591" Name="XYZ" No="334" />
<CITYINFO City="591" Name="BJD" No="335" />
<CITYINFO City="591" Name="UUS" No="390" />
</CITYINFO_LIST>
</UPDATEINFO>
</TESTINFO>
其中CITYINFO可能是个很大的列表。 完整的程序代码如下:
view plaincopy to clipboardprint?package com.atu.xmltest;
import java.io.InputStream;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ElementHandler;
import org.dom4j.ElementPath;
import org.dom4j.io.SAXReader;
public class MySaxHandler implements ElementHandler {
SAXReader reader;
public MySaxHandler() {
// test.xml文件跟类放在同一目录下
try {
InputStream is = MySaxHandler.class.getResourceAsStream("test.xml");
reader = new SAXReader();
reader.setDefaultHandler(this);
reader.read(is);
} catch (DocumentException e) {
e.printStackTrace();
}
}
@Override
public void onEnd(ElementPath ep) {
Element e = ep.getCurrent(); //获得当前节点
if(e.getName().equals("PARAM_TIMESTAMP"))
System.out.println("解析到时间:"+e.getText());
else if(e.getName().equals("CITYINFO")){
System.out.printf("解析到CITYINFO,属性值为:%s,%s,%s/n", e
.attributeValue("City"), e.attributeValue("Name"), e
.attributeValue("No"));
}
e.detach(); //记得从内存中移去
}
@Override
public void onStart(ElementPath ep) {
}
public static void main(String[] args){
new MySaxHandler();
}
}
package com.atu.xmltest;
import java.io.InputStream;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ElementHandler;
import org.dom4j.ElementPath;
import org.dom4j.io.SAXReader;
public class MySaxHandler implements ElementHandler {
SAXReader reader;
public MySaxHandler() {
// test.xml文件跟类放在同一目录下
try {
InputStream is = MySaxHandler.class.getResourceAsStream("test.xml");
reader = new SAXReader();
reader.setDefaultHandler(this);
reader.read(is);
} catch (DocumentException e) {
e.printStackTrace();
}
}
@Override
public void onEnd(ElementPath ep) {
Element e = ep.getCurrent(); //获得当前节点
if(e.getName().equals("PARAM_TIMESTAMP"))
System.out.println("解析到时间:"+e.getText());
else if(e.getName().equals("CITYINFO")){
System.out.printf("解析到CITYINFO,属性值为:%s,%s,%s/n", e
.attributeValue("City"), e.attributeValue("Name"), e
.attributeValue("No"));
}
e.detach(); //记得从内存中移去
}
@Override
public void onStart(ElementPath ep) {
}
public static void main(String[] args){
new MySaxHandler();
}
}
运行结果:
解析到时间:2010-12-22 09:54:09
解析到CITYINFO,属性值为:591,XYZ,334
解析到CITYINFO,属性值为:592,BJD,335
解析到CITYINFO,属性值为:593,UUS,390
分享到:
相关推荐
本篇文章将深入探讨如何利用DOM4J解析SOAP消息中的元素,以便在实际项目中进行有效的数据提取和操作。 首先,理解SOAP消息的结构至关重要。一个典型的SOAP消息如下所示: ```xml <!-- Header元素中的内容 --> ...
在“dom4j解析xml文件(增删改查)”这个主题中,我们将深入探讨如何使用DOM4J来实现XML文档的四种基本操作:增加元素、删除元素、更新元素内容以及查询元素。 首先,让我们了解DOM4J的基本用法。在解析XML文件时,...
在`CacheInit.java`这个示例中,可能包含了利用DOM4J解析`emailTemplateConfig.xml`文件,提取或修改其中的配置信息,以初始化缓存或其他系统设置的逻辑。通过上述步骤,你可以理解并实现类似的功能。
在这个示例中,我们将深入探讨如何利用Maven管理和DOM4j来操作XML文件。 首先,让我们了解一下Maven。Maven是Apache软件基金会的一个项目,它通过定义项目对象模型(Project Object Model,POM)来管理项目的构建、...
2. **性能**:DOM4J不仅支持DOM解析,还支持SAX和STAX解析,后者在处理大型XML文件时能有效减少内存占用。 3. **内存效率**:SAX解析器采用事件驱动模型,只在需要时处理XML元素,避免了内存不足的问题。 4. **易用...
下面我们将详细探讨如何使用SaxReader解析XML文件: 1. 引入Dom4j库:在Java项目中,可以通过Maven或Gradle等构建工具引入Dom4j依赖。例如,在Maven的pom.xml文件中添加: ```xml <groupId>dom4j <artifactId>...
总结来说,这些文件共同展示了如何利用DOM4J库处理大文件,尤其是通过SAX解析和事件处理来避免内存溢出问题。在实际开发中,对于大文件的XML处理,使用这样的策略能够提高程序的稳定性和效率,同时减少对系统资源的...
### DOM4J解析XML知识点详解 #### 一、DOM4J简介 DOM4J(Document Object Model for XML)是一款用于处理XML文档的轻量级Java库。它提供了一种非常简单且灵活的方式来创建、读取、修改和删除XML文档。DOM4J的主要...
1. **解析XML文件**:使用DOM4J的`DocumentFactory`创建解析器,如`SAXReader`,然后读取XML文件,生成一个`Document`对象。 2. **访问XML结构**:通过`Document`对象,可以获取根元素(`Element`),进一步遍历...
在本实例中,我们将深入探讨如何使用DOM4J解析XML,并利用这些数据连接Oracle数据库进行数据操作。 首先,让我们了解DOM4J的基本用法。DOM4J的主要类包括`Document`、`Element`、`Attribute`和`Namespace`。`...
本篇将深入探讨Dom4j的封装和解析技术,以及如何利用它来处理XML文件。 **1. Dom4j基本概念** Dom4j是一个基于Java的XML处理库,它的核心是DOM(Document Object Model)模型,但比Java内置的DOM API更加轻量级和...
在本实例中,我们将探讨如何利用DOM4J库解析XML响应,以便有效地处理WebService短信接口返回的数据。 DOM4J是一个强大的Java XML API,它提供了丰富的功能来读取、写入、修改以及查询XML文档。在处理WebService短信...
Java DOM4J解析XML详解 XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件和文档存储等领域。DOM4J是Java中一个强大的、轻量级的处理XML的库,它提供了丰富的API来读取、...
- 解析XML文件:使用`DocumentReader`或`SAXReader`读取XML文件并构建DOM4J树形结构。 - 遍历XML:利用`Node`接口的方法如`childNodes()`,`elements()`遍历XML结构。 - XPath查询:通过`XPathExpression`执行...
在本文中,我们将深入探讨DOM4J如何解析XML文件,并讨论如何利用它来创建XML文档。 ### 1. XML解析 XML(eXtensible Markup Language)是一种标记语言,常用于数据交换和存储结构化数据。DOM4J提供了两种主要的...
另外,DOM4J支持SAXReader和SAXWriter,利用SAX解析器的流式处理,减少内存占用。 总之,DOM4J是Java开发中处理XML的利器,提供了全面的功能和优秀的性能。通过将其jar包导入Eclipse项目,开发者可以轻松地进行XML...
- **SAXReader**:用于解析XML文档,将XML数据转换为DOM4J的Document对象。 - **XMLWriter**:将DOM4J的Document对象写回XML文件,提供格式化的输出。 - **XPath**:基于XPath表达式进行查询,可以快速定位XML...
在本文中,我们将深入探讨DOM4J如何实现XML的面向对象解析,以及如何利用递归算法处理XML结构。 一、DOM4J基本概念 DOM4J的核心是基于树形结构的Document对象,它代表了整个XML文档。在这个结构中,Element表示XML...