对于普通大小xml的解析,现在有许多的插件能很好的支持,比如dom4j,JDOM等,由于已经做过一层封装。因此,用起来也很方便。
当然对于这样的xml解析没有什么问题,也不必花费笔墨去探讨了。
前两天遇到一个300多M的超大xml解析,基本用什么编辑器打开,什么编辑器就崩溃的。
如果用类似dom4j等解析方式,在解析之前需要把文件先加载到内存
File xmlFile = new File(fileName);
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(xmlFile);
由于文件超大,基本什么服务器都会OutOfMemory;不给力了啊····结果也可想而知
后来使用了SAX处理方式,解析一点文件读取一点到内存,这样就不会再出现内存溢出情况,具体请看代码
AnalyticElongHotelXml analyticElongHotelXml = new AnalyticElongHotelXml(elongHotelsDAO);
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
import com.mm.components.elong.dao.ElongHotelsDAO;
import com.mm.components.elong.domain.ElongHotels;
import com.mm.components.elong.domain.ElongImages;
import com.mm.components.elong.domain.ElongRooms;
import com.mm.exception.MMException;
import com.mm.util.StringUtils;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 解析elong Hotel_cn.xml文件
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2011</p>
* <p>Company: Yododo</p>
* <p>Date: 2011-2-15</p>
* <p>Time: 15:01:14</p>
*
* @author eng
* $Header: $
* $Revision: $
* $Author: $
*/
public class AnalyticElongHotelXml extends DefaultHandler {
private ElongHotelsDAO elongHotelsDAO = null;
java.util.Stack tags = new java.util.Stack();
private String fatherQName = "";
private boolean isFromEndElement = false;
private static List<ElongHotels> hotels = null;
private static List<ElongImages> images = null;
private static List<ElongRooms> rooms = null;
private ElongHotels hotel = null;
private ElongImages image = null;
private ElongRooms room = null;
public AnalyticElongHotelXml() {
super();
}
public AnalyticElongHotelXml(ElongHotelsDAO elongHotelsDAO) {
super();
this.elongHotelsDAO = elongHotelsDAO;
}
@Override
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
String value = new String(ch, start, length);
if(isFromEndElement){
if(fatherQName.equals("image")){
initImageMsg(tag,value);
}else if(fatherQName.equals("airportPickUpService")){
}else if(fatherQName.equals("generalAmenities")){
if("Overview".equals(tag)){
hotel.setGeneralamenities(value);
}
}
}
}
@Override
public void startElement(String uri,String localName,String qName, Attributes attrs) {
tags.push(qName);
isFromEndElement = true;
if(qName.equals("HotelDetail")){
hotel = new ElongHotels();
}else if(qName.equals("image")){
fatherQName = "image";
image = new ElongImages();
}
}
@Override
public void endElement(String uri,String localName,String qName)
throws SAXException {
isFromEndElement = false;
if(qName.equals("HotelDetail")){
hotel.setImgurl(getoneimage());
hotels.add(hotel);
if(qName.equals("image")){
image.setHotelid(hotel.getHotelid());
images.add(image);
fatherQName = "";
image = null;
}else if(qName.equals("airportPickUpService")){
fatherQName = "";
}
}
private void initHotelMsg(String tag , String value){
if("id".equals(tag)){
hotel.setHotelid(value);
}else if("dateUpdated".equals(tag)){
}else if("name".equals(tag)){
hotel.setName(value);
}
}
private void initImageMsg(String tag , String value){
if("imgUrl".equals(tag)){
image.setImgurl(value);
}else if("imgType".equals(tag)){
image.setImgtype(Integer.parseInt(value));
}else if("title".equals(tag)){
image.setTitle(value);
}
}
private void initRoomMsg(String tag , String value){
if("roomTypeId".equals(tag)){
room.setRoomtypeid(value);
}else if("roomName".equals(tag)){
room.setRoomname(value);
}else if("roomTypeNum".equals(tag)){
room.setRoomtypenum(Integer.parseInt(value));
}
}
public static List<ElongRooms> getRooms() {
return rooms;
}
public static List<ElongImages> getImages() {
return images;
}
public static List<ElongHotels> getHotels() {
return hotels;
}
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
AnalyticElongHotelXml reader = new AnalyticElongHotelXml();
sp.parse(new InputSource("D:\\Projects\\tour\\src\\com\\elong\\message\\Hotel_cn.xml"), reader);
System.out.println("success");
for(ElongHotels s : hotels){
if(s.getHotelid().equals("03")){
System.out.println(s.getName());
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");
}
}
sp.parse(new InputSource("D:\\Projects\\tour\\src\\com\\elong\\message\\Hotel_cn.xml"),analyticElongHotelXml);
我们可以重写DefaultHandler类的characters,startElement等方法,在里面实现自己需要的业务逻辑
分享到:
相关推荐
以下是一个简单的SAX解析超大XML文件的Java示例代码: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers....
2. **SAX解析**:除了DOM,dom4j还支持SAX(Simple API for XML)解析器,适用于处理大型XML文件,因为它不需要一次性加载整个文档到内存。 3. **XPath支持**:dom4j内置了XPath引擎,可以使用XPath表达式方便地定位...
- 内存消耗大:对于大型XML文件,DOM可能会消耗大量内存,因为它需要一次性加载整个文档。 - 性能问题:由于需要构建完整的DOM树,解析速度相对较慢。 **2. SAX解析** SAX(Simple API for XML)是一种事件驱动的...
例如,通过`创建XML文档对象`、`加载XML文件`、`查找指定元素`、`获取属性值`等命令,可以实现对XML数据的读取。 4. **SAX解析**:与DOM不同,SAX解析器不将整个XML文档加载到内存,而是通过事件回调函数处理每个...
本文将深入探讨如何使用C++来解析XML文件,主要围绕“C++实现对xml文件的解析”这一主题展开。 XML文件通常包含一系列元素,每个元素都有开始标签、结束标签和可能的属性。C++中解析XML文件的方法多种多样,这里...
1. **XML解析**:TinyXML2通过`XMLDocument`类来表示整个XML文档,你可以使用`LoadFile()`或`Parse()`方法加载XML文件或内存中的XML字符串。解析完成后,文档的结构被映射为一系列的节点,包括元素(XMLElement)、...
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API...这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
本项目“tinyxml2解析XML文件读取数据”主要关注如何使用tinyxml2库来高效地解析XML文件并提取其中的数据。以下将详细介绍tinyxml2库的关键功能和使用方法。 1. **tinyxml2库介绍** - tinyxml2提供了DOM(Document...
本文将深入探讨使用C语言编写的XML文件解析源码,并讲解如何实现XML文件的基本操作,如查找、增加和删除节点。 在C语言中处理XML文件通常涉及到以下几个关键步骤: 1. **内存管理**:由于C语言没有内置的高级数据...
通过“打开XML文件”,LabVIEW会创建一个指向XML文档的引用,然后“解析XML文档”将XML内容转换为LabVIEW可以处理的数据结构,如簇或字符串数组。 接着,是XML保存的操作。当需要将处理过的数据写回XML文件时,可以...
XML 文件解析问题 XML 文件解析是指将 XML 文件转换为可被计算机理解和处理的格式。XML 文件解析问题是指在解析 XML 文件时遇到的问题,例如解析速度慢、内存占用高、解析错误等。 在 XML 文件解析中,主要有两种...
根据给定文件中的标题、描述、标签以及部分内容,可以总结并深入探讨以下关于C#中XML解析的关键知识点: ### C#中的XML解析方式 #### 1. XML Text Reader(流式解析) - **简介**:在.NET框架中,`XMLTextReader`...
SAX(Simple API for XML)是XML解析的一种方法,它以事件驱动的方式处理XML文档,非常适合处理大体积的XML文件,因为它不需要一次性加载整个文件到内存,而是逐行读取,因此节省了资源。 **SAX解析XML的基本原理:...
DOM解析器将整个XML文件加载到内存中,形成一个树形结构,可以方便地遍历和修改XML文档的任何部分。然而,由于它需要一次性加载整个文件,对于大文件来说可能会消耗大量内存。 在"ReadXMLDemo"中,使用DOM解析的...
XML文件解析工具类
- 首先,使用DOM解析器加载XML文件,获取到XML文档的根节点。 - 然后,遍历XML树,提取出股票代码、价格等关键信息。 - 最后,使用JDBC连接Oracle数据库,执行INSERT语句将数据存入。 2. 使用SAX解析XML并查询...
Tinyxml 文件解析经典例子 TinyXML 是一个开源的解析 XML 的解析库,能够用于 C++,能够在 Windows 或 Linux 中编译。这个解析库的模型通过解析 XML 文件,然后在内存中生成 DOM 模型,从而让我们很方便的遍历这棵...
这个"xml.rar"压缩包包含了一系列与XML文档解析相关的源代码文件,对于初学者来说,是理解XML解析机制的一个很好的实例。 1. **XML文档结构**: XML文档由一系列元素组成,每个元素通过开始标签 `<tag>` 和结束...
### 用C++语言实现XML文件解析的一种方案 #### 概述 随着互联网技术的不断发展,XML(可扩展标记语言)作为一种重要的数据交换格式,在各领域中的应用日益广泛。XML以其良好的可读性和开放性成为了数据共享的标准...
然而,由于资源限制,STM32往往没有内置专门用于XML解析的硬件模块,因此需要软件库来处理XML文件。在这种背景下,ezxml库应运而生。 ezxml库是一个轻量级的C语言XML解析库,设计用于嵌入式环境,包括STM32这类微...