`
yangjayup
  • 浏览: 252348 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

超大xml文件解析

阅读更多

对于普通大小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文件 示例代码

    以下是一个简单的SAX解析超大XML文件的Java示例代码: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers....

    XML文档解析相关工具

    2. **SAX解析**:除了DOM,dom4j还支持SAX(Simple API for XML)解析器,适用于处理大型XML文件,因为它不需要一次性加载整个文档到内存。 3. **XPath支持**:dom4j内置了XPath引擎,可以使用XPath表达式方便地定位...

    xml解析文件的两种方式

    - 内存消耗大:对于大型XML文件,DOM可能会消耗大量内存,因为它需要一次性加载整个文档。 - 性能问题:由于需要构建完整的DOM树,解析速度相对较慢。 **2. SAX解析** SAX(Simple API for XML)是一种事件驱动的...

    易语言 xml解析 易语言 xml解析 教程 带源码

    例如,通过`创建XML文档对象`、`加载XML文件`、`查找指定元素`、`获取属性值`等命令,可以实现对XML数据的读取。 4. **SAX解析**:与DOM不同,SAX解析器不将整个XML文档加载到内存,而是通过事件回调函数处理每个...

    C++解析xml文件

    本文将深入探讨如何使用C++来解析XML文件,主要围绕“C++实现对xml文件的解析”这一主题展开。 XML文件通常包含一系列元素,每个元素都有开始标签、结束标签和可能的属性。C++中解析XML文件的方法多种多样,这里...

    C++ XML文件解析库 tinyxml2

    1. **XML解析**:TinyXML2通过`XMLDocument`类来表示整个XML文档,你可以使用`LoadFile()`或`Parse()`方法加载XML文件或内存中的XML字符串。解析完成后,文档的结构被映射为一系列的节点,包括元素(XMLElement)、...

    XML解析工具

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API...这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

    tinyxml2解析XML文件读取数据

    本项目“tinyxml2解析XML文件读取数据”主要关注如何使用tinyxml2库来高效地解析XML文件并提取其中的数据。以下将详细介绍tinyxml2库的关键功能和使用方法。 1. **tinyxml2库介绍** - tinyxml2提供了DOM(Document...

    C写的解析xml文件源代码

    本文将深入探讨使用C语言编写的XML文件解析源码,并讲解如何实现XML文件的基本操作,如查找、增加和删除节点。 在C语言中处理XML文件通常涉及到以下几个关键步骤: 1. **内存管理**:由于C语言没有内置的高级数据...

    XML解析器示例

    通过“打开XML文件”,LabVIEW会创建一个指向XML文档的引用,然后“解析XML文档”将XML内容转换为LabVIEW可以处理的数据结构,如簇或字符串数组。 接着,是XML保存的操作。当需要将处理过的数据写回XML文件时,可以...

    XML文件解析问题.pdf

    XML 文件解析问题 XML 文件解析是指将 XML 文件转换为可被计算机理解和处理的格式。XML 文件解析问题是指在解析 XML 文件时遇到的问题,例如解析速度慢、内存占用高、解析错误等。 在 XML 文件解析中,主要有两种...

    C# XML解析方式

    根据给定文件中的标题、描述、标签以及部分内容,可以总结并深入探讨以下关于C#中XML解析的关键知识点: ### C#中的XML解析方式 #### 1. XML Text Reader(流式解析) - **简介**:在.NET框架中,`XMLTextReader`...

    Sax解析XML文件解析

    SAX(Simple API for XML)是XML解析的一种方法,它以事件驱动的方式处理XML文档,非常适合处理大体积的XML文件,因为它不需要一次性加载整个文件到内存,而是逐行读取,因此节省了资源。 **SAX解析XML的基本原理:...

    android下解析xml文件的demo

    DOM解析器将整个XML文件加载到内存中,形成一个树形结构,可以方便地遍历和修改XML文档的任何部分。然而,由于它需要一次性加载整个文件,对于大文件来说可能会消耗大量内存。 在"ReadXMLDemo"中,使用DOM解析的...

    XML文件解析代码

    XML文件解析工具类

    xml文件解析示范

    - 首先,使用DOM解析器加载XML文件,获取到XML文档的根节点。 - 然后,遍历XML树,提取出股票代码、价格等关键信息。 - 最后,使用JDBC连接Oracle数据库,执行INSERT语句将数据存入。 2. 使用SAX解析XML并查询...

    Tinyxml文件解析经典例子

    Tinyxml 文件解析经典例子 TinyXML 是一个开源的解析 XML 的解析库,能够用于 C++,能够在 Windows 或 Linux 中编译。这个解析库的模型通过解析 XML 文件,然后在内存中生成 DOM 模型,从而让我们很方便的遍历这棵...

    xml.rar_XML 文档 解析_XML 解析_XML文档

    这个"xml.rar"压缩包包含了一系列与XML文档解析相关的源代码文件,对于初学者来说,是理解XML解析机制的一个很好的实例。 1. **XML文档结构**: XML文档由一系列元素组成,每个元素通过开始标签 `&lt;tag&gt;` 和结束...

    用C++语言实现XML文件解析的一种方案

    ### 用C++语言实现XML文件解析的一种方案 #### 概述 随着互联网技术的不断发展,XML(可扩展标记语言)作为一种重要的数据交换格式,在各领域中的应用日益广泛。XML以其良好的可读性和开放性成为了数据共享的标准...

    STM32使用ezxml解析XML文件

    然而,由于资源限制,STM32往往没有内置专门用于XML解析的硬件模块,因此需要软件库来处理XML文件。在这种背景下,ezxml库应运而生。 ezxml库是一个轻量级的C语言XML解析库,设计用于嵌入式环境,包括STM32这类微...

Global site tag (gtag.js) - Google Analytics