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

DOM4J vs SAX

    博客分类:
  • XML
阅读更多
网上都说DOM4J加载大型的xml开销很大, 这里来做一个实验


package xml.dom4j;

public class Test {
	
	public static void main(String[] args) {
		// operlog.xml 10万行  4MB  消耗JVM内存 11M
		// operlog2.xml 100行  5k  消耗JVM内存 0
		Test.loadLogXML("C:\\WKP_HP1\\TestCaseHp1\\src\\operlog2.xml");
	}
	
	
	public static void loadLogXML(String file) {
		Runtime runtime = Runtime.getRuntime();
		System.out.println("当前虚拟机最大可用内存为: " + runtime.maxMemory() / 1024 / 1024 + "M");
		System.out.println("当前虚拟机已占用内存: " + runtime.totalMemory() / 1024 / 1024 + "M");

		try {
			SAXReader reader = new SAXReader();
			Document doc = null;
			try {
				doc = reader.read(new File(file));
			} catch (DocumentException e) {
				System.out.println("读取配置文件错误");
				return;
			}
			System.out.println("当前虚拟机已占用内存: " + runtime.totalMemory() / 1024 / 1024 + "M");
			Element root = doc.getRootElement();
			List poNodes = root.elements("po");
			for (Iterator it = (Iterator) poNodes.iterator(); it.hasNext();) {
				Element elm = (Element) it.next();

				String beanName = elm.attributeValue("name");
				String moduleName = elm.attributeValue("moduleName");
				String sysId = elm.attributeValue("sysId");


				List nodes = elm.elements("field");
				List<String> listField = new ArrayList<String>();
				for (Iterator it2 = (Iterator) nodes.iterator(); it2.hasNext();) {

					Element elm2 = (Element) it2.next();
					String fieldName = elm2.attributeValue("name");
					String CNName = elm2.getText();
					//System.out.println((fieldName + "," + CNName));

				}
			}
		} catch (Exception e) {
			System.out.println("加载日志配置文件时,碰到运行时异常: " + e.toString());
		}
	}
}


最后发现 加载 10万行数据的 jvm也只用了11M, 完全可以接受的。


附xml文件

<doc>
<po name="cia.common.db.orm.po.TblBkeMchntUsrInf" moduleName="MMG" sysId="2">
	<field name="usrId">用户ID</field>
	<field name="mchntCd">所属机构号</field>
</po>
<po name="cia.common.db.orm.po.TblBkeMchntUsrpwdInf" moduleName="MMG" sysId="2">
	<field name="mchntCd">商户号</field>
	<field name="usrId">用户ID</field>
	<field name="usrPwd">用户密码</field>
</po>

<!-- PPP机构信息管理 -->
<po name="cia.common.db.orm.po.TblBkePppInsInfo"  moduleName="CIM" sysId="2">
	<field name="insTp">机构类型</field>
	<field name="pppInsCd">机构号</field>
	<field name="insNm">机构名称</field>
</po>
<!-- 全卡bin管理  -->
<po name="cia.common.db.orm.po.TblBkeBin" moduleName="BIM" sysId="2">
	<field name="cardBin">卡BIN</field>
	<field name="panLen">卡号长度</field>
	<field name="issInsCd">发卡机构代码</field>
	<field name="issInsCnNm">发卡机构名称</field>
	<field name="cardAttr">卡性质</field>
	<field name="cardBrand">卡品牌</field>
	<field name="cardCata">卡类别</field>

</po>
</doc>



DOM4J 用来加载系统的配置文件还是OK的。 但用来接收外系统的数据就不合适了
1, 因为数据量的问题
2, DOM4J 适合解析固定tab name的xml, 对于处理下列的XML就杯具了。
<?xml version="1.0" encoding="utf-8"?>

<!--XML file generated by Excel Input Tool-->
<ConfigMessage xmlns="http://schemas.hp.com/CfM/ucmdb/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.hp.com/CfM/ucmdb/ ConfigMessage.xsd">
  <ConfigMessageHeader>
    <cmdbContext>cis</cmdbContext>
    <dataSource>CIS DERIVED VALUE - will be a valid MDM Company Code</dataSource>
    <dataSourceContact/>
    <dataSourceContactEmail>CPLUS001@cplus.com</dataSourceContactEmail>
    <simulate>false</simulate>
	</ConfigMessageHeader>

	<CIsAndRelations>
		<CIsForUpdate>
			<CI>
			  <netdevice>
			    <data_adminstate>0</data_adminstate>
			    <data_externalid>CPLUS_consoleswitch_002</data_externalid>
			    <data_note>ConsoleSwitch_Note</data_note>
			    <data_operationstate>0</data_operationstate>
			    <data_origin>ESL</data_origin>
			    <description>Description_ConsoleSwitch</description>
			    <document_list>DocumentsDocumentsDocumentsDocumentsDocumentsDocum</document_list>
			    <name>ConsoleSwitch_Name_Judy_002</name>
			    <TenantOwner>ACT</TenantOwner>
			    <TenantsUses>CPLUS</TenantsUses>
			    <user_label>ConsoleSwitch_UserLable_Judy_002</user_label>
			    <related_ciexternalid></related_ciexternalid>
			    <related_cit></related_cit>
			    <hp_envrmt_type_nm>Pending</hp_envrmt_type_nm>
			    <hp_user_defined_attribute1_txt>Attribute1</hp_user_defined_attribute1_txt>
			    <hp_user_defined_attribute2_txt>Attribute2</hp_user_defined_attribute2_txt>
			    <hp_user_defined_attribute3_txt>Attribute3</hp_user_defined_attribute3_txt>
			    <hp_user_defined_attribute4_txt>Attribute4</hp_user_defined_attribute4_txt>
			    <hp_user_defined_attribute5_txt>Attribute5</hp_user_defined_attribute5_txt>
			    <hp_regulatory_status_flg>true</hp_regulatory_status_flg>
			    <sacm_lifecycle_status>Pending</sacm_lifecycle_status>
			    <hp_inventory_id>InventoryId123</hp_inventory_id>
			    <codepage>CodePage</codepage>
			    <hp_cust_req_excpn_flg>true</hp_cust_req_excpn_flg>
			    <hp_location_txt>VIA|3F</hp_location_txt>
			    <hp_ci_alias_nm>AliasName123</hp_ci_alias_nm>
			    <bios_asset_tag>BiosAssetTag01</bios_asset_tag>
			    <bios_serial_number>N123456</bios_serial_number>
			    <bios_uuid>BiosUuid001</bios_uuid>
			    <calculated_location>CalculatedLocation001</calculated_location>
			    <domain_name>HP.com</domain_name>
			    <host_iscomplete>true</host_iscomplete>
			    <host_isdesktop>true</host_isdesktop>
			    <host_isroute>true</host_isroute>
			    <host_isvirtual>true</host_isvirtual>
			    <host_key>HostKey1234</host_key>
			    <host_nnm_uid>123456</host_nnm_uid>
			    <host_osaccuracy>HostOSA</host_osaccuracy>
			    <host_osrelease>HostOSRelease123</host_osrelease>
			    <host_servertype>HostServerType123</host_servertype>
			    <memory_size>1024</memory_size>
			    <net_bios_name>NetBiosName1213</net_bios_name>
			    <node_family>NodeFamily123</node_family>
			    <node_model>AIX 6.1</node_model>
			    <node_role>ConsoleSwitch</node_role>
			    <os_family>baremetal_hypervisor</os_family>
			    <primary_dns_name>PrimaryDnsName123</primary_dns_name>
			    <serial_number>SerialNo123</serial_number>
			    <swap_memory_size>100</swap_memory_size>
			    <sys_object_id>SysObjectId123</sys_object_id>
			    <vendor>IBM</vendor>
			    <hp_product_code_txt>ProductNo123</hp_product_code_txt>
			    <hp_approval_group_txt>StringVal456</hp_approval_group_txt>
			    <hp_approval_sequence_nbr>59</hp_approval_sequence_nbr>
			  </netdevice>
			</CI>
		</CIsForUpdate>
		<relationsForUpdate>
		</relationsForUpdate>
	</CIsAndRelations>
</ConfigMessage>


这时候适合用SAX来解析

package com.hp.ucmdb.util;

import java.io.FileInputStream;
import java.io.IOException;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class ParseFileUtils extends DefaultHandler {

	public static void main(String[] args) throws SAXException, IOException {
		ParseFileUtils instance = new ParseFileUtils();
		instance.doParsing("c:\\222.xml");
	}
	
	// method for file validation and parsing.
	public void doParsing(String fileName) throws SAXException,
			IOException {
		XMLReader parser = XMLReaderFactory.createXMLReader();
		ContentHandler cHandler = this;
		parser.setContentHandler(cHandler);

		FileInputStream input = null;
		try {
			input = new FileInputStream(fileName);
			parser.parse(new InputSource(input));
		} catch (SAXParseException ex) {
			throw ex;
		} finally {
			if (input != null) {
				try {
					input.close();
				} catch (Exception e) {
				}
			}
		}
	}

	String v = "";
	StringBuffer sb = null;
	
	public void startElement(String namespace, String localName,
			String qualifiedName, Attributes atts) throws SAXException {
		sb = new StringBuffer();
		System.out.println(localName);
	}

	public void characters(char[] ch, int start, int length)
			throws SAXException {
		sb.append(ch, start, length);
	}
	public void endElement(String namespaceURI, String localName, String qName)
			throws SAXException {
		String strValue = sb.toString();
		if(strValue != null && !"".equals(strValue) && !"".equals(strValue.trim())){
			System.out.println(" v: " + strValue);
		}
		sb = new StringBuffer();
		
	}

	
}



另外, DOM4J 和 SAX 都可以进行schema验证



分享到:
评论

相关推荐

    dom4j下sax解析xml

    总结起来,dom4j库提供了DOM和SAX两种XML解析方式,而SAX解析在处理大文件时具有性能优势。通过注册事件处理器,开发者可以在解析过程中动态响应XML结构,实现灵活的数据处理。在实际工作中,选择合适的解析方法取决...

    Dom4J与SAX解析实例

    本教程将深入探讨Dom4J和SAX两种解析器在处理XML时的使用方法和特点。 **DOM解析**: DOM解析器将整个XML文件加载到内存中,构建一棵由节点组成的树形结构,称为DOM树。这种解析方式方便对XML进行随机访问,但对...

    dom+dom4J+SAX 解析

    本程序的核心是利用DOM、DOM4J和SAX三种不同的方式解析XML文档,每种方法都有其独特的优势和适用场景。 1. DOM解析: DOM(Document Object Model)是一种将XML文档转换为内存中树形结构的模型。它将XML文件加载到...

    dom4j下的sax解析xml

    DOM4J库是Java中广泛使用的XML处理工具,它提供了SAX解析XML的功能。SAX(Simple API for XML)是一种事件驱动的解析器,适用于处理大型XML文档,因为它不需要将整个文档加载到内存中,因此在处理大文件时比DOM...

    生成、解析xml的四种方式(dom,dom4j,sax,jdom)

    本文将详细介绍生成和解析XML的四种主要方法:DOM、DOM4J、SAX和JDOM。 1. DOM(Document Object Model) DOM是W3C组织推荐的一种解析XML的标准方式。它将XML文档视为一个树形结构,每个节点代表XML文档的一部分。...

    XML的四种解析器(dom,sax,jdom,dom4j)原理及性能比较,超详细

    常见的 XML 解析器有 DOM、SAX、JDOM 和 DOM4J 等。每种解析器都有其特点和优缺,选择合适的解析器对应用程序的性能和开发效率有很大影响。 1. DOM 解析器 DOM(Document Object Model)是 W3C 官方标准,用于表示...

    DOM4J_SAX_DOM_XML的实例

    DOM4J、SAX和DOM是处理XML文档的三种主要解析器或API,它们各有特点,适用于不同的场景。 1. DOM(Document Object Model) DOM是一种将XML文档转换为内存中的树形结构的模型,它允许开发者通过节点层次结构来访问...

    dom,dom4j,sax 解析xml文件实例

    本文将深入探讨DOM、DOM4J和SAX三种常用的XML解析方法,并结合具体的实例进行详细讲解。 首先,DOM(Document Object Model)是W3C组织推荐的一种XML解析标准。它将整个XML文档加载到内存中,构建一个树形结构,...

    java操作xml dom dom4j sax jdom

    以上四种方式各有优缺点,DOM适合小文件并要求快速访问任何部分,SAX适合大文件但需要实时处理,DOM4J和JDOM提供了更友好的API但可能消耗更多资源。在实际开发中,应根据项目需求选择合适的方法。在提供的"testxml...

    dom4j基础入门文档(SAX,DOM,XPATH)

    【dom4j基础入门文档(SAX,DOM,XPATH)】 dom4j是一个流行的Java库,专门用于处理XML文档。相较于W3C DOM API,dom4j的优势在于它内置了本地XPath支持,使得XML文档的查询和操作更为简便。本文将深入介绍dom4j的...

    XML解析的四种方法源码(DOM, JDOM ,DOM4J , SAX)

    在Java中,解析XML文件是常见的任务,通常有四种主要的方法:DOM (Document Object Model),JDOM,DOM4J以及SAX (Simple API for XML)。以下是对这四种XML解析方式的详细介绍: 1. DOM解析: DOM是一种树形结构的...

    xml 三种解析方式dom,sax,dom4j

    为了处理XML文档,有三种主要的解析方式:DOM、SAX和DOM4J。每种方法都有其特点和适用场景,下面将详细介绍这三种解析方式。 1. DOM(Document Object Model) DOM解析器将整个XML文档加载到内存中,构建一个树形...

    dom,dom4j,sax对xml进行解析

    对于XML的解析,有多种方法,包括DOM、DOM4J和SAX。以下是关于这三种解析方式的详细介绍: 1. DOM(Document Object Model)解析: DOM是一种树形结构,它将XML文档视为一个对象模型,通过这种方式,程序可以方便...

    DOM4J jar包 xml解析 所有的dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1包 导入直接使用

    6. **StAX(Streaming API for XML)支持**:DOM4J也支持StAX解析器,这种解析方式结合了SAX的高效和DOM的易用性,可以在处理大型XML文件时节省内存。 7. **与JAXB集成**:DOM4J可以与Java Architecture for XML ...

    一写小例子,dom4J,dom,jdom,sax解析和创建XML文件,代码虽然简单,但是功能实现,适合入门

    本文将详细介绍四种主流的Java XML处理库:DOM4J、DOM、JDOM和SAX,并通过简单的代码示例帮助初学者入门。 1. DOM (Document Object Model) DOM是W3C制定的一种标准,它将XML文档视为一个树形结构,允许开发者通过...

    dom jdom sax dom4j 原理性能比

    本篇文章将探讨四种处理XML的Java库:DOM、JDOM、SAX和DOM4J,分析它们的原理、性能特点以及适用场景。 首先,我们来了解DOM(Document Object Model)。DOM是W3C组织定义的一种API,它将XML文档解析为一个树形结构...

    dom4j-2.1.3.zip

    DOM4J是一个强大的Java XML API,它提供了丰富的XML处理功能,包括文档对象模型(DOM)、简单API(SAX)以及事件驱动模型(StAX)。在本篇文章中,我们将深入探讨DOM4J 2.1.3版本,了解其核心特性、用途以及如何利用...

    dom4j所依赖的所有jar包

    1. **XML解析**:DOM4J支持多种解析方式,包括SAX解析、DOM解析和DOM4J自己的解析器。SAX解析适用于大文件,因为它按需读取,节省内存;DOM解析则将整个XML文档加载到内存,适合小文件;DOM4J解析器则提供了更灵活的...

    dom4j_dom4j1.6.1安装包_

    首先,DOM4J是一个基于Java的XML处理库,它支持多种XML处理模型,如SAX和DOM。DOM4J的核心特性包括XML文档的构建、解析、查询和修改。它还提供了XPath支持,允许开发者通过简洁的表达式来定位XML文档中的元素。 DOM...

    dom4j_1.6.1.jar dom4j_2.1.0.jar

    3. **解析XML**:DOM4J提供两种主要的解析方式,SAX解析和DOM解析。SAX解析适用于大型XML文件,因为它以流式处理数据,占用内存小;DOM解析则将整个XML文档加载到内存,便于操作,适合小型文件。 4. **操作XML**:...

Global site tag (gtag.js) - Google Analytics