网上都说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库提供了DOM和SAX两种XML解析方式,而SAX解析在处理大文件时具有性能优势。通过注册事件处理器,开发者可以在解析过程中动态响应XML结构,实现灵活的数据处理。在实际工作中,选择合适的解析方法取决...
本教程将深入探讨Dom4J和SAX两种解析器在处理XML时的使用方法和特点。 **DOM解析**: DOM解析器将整个XML文件加载到内存中,构建一棵由节点组成的树形结构,称为DOM树。这种解析方式方便对XML进行随机访问,但对...
本程序的核心是利用DOM、DOM4J和SAX三种不同的方式解析XML文档,每种方法都有其独特的优势和适用场景。 1. DOM解析: DOM(Document Object Model)是一种将XML文档转换为内存中树形结构的模型。它将XML文件加载到...
DOM4J库是Java中广泛使用的XML处理工具,它提供了SAX解析XML的功能。SAX(Simple API for XML)是一种事件驱动的解析器,适用于处理大型XML文档,因为它不需要将整个文档加载到内存中,因此在处理大文件时比DOM...
本文将详细介绍生成和解析XML的四种主要方法:DOM、DOM4J、SAX和JDOM。 1. DOM(Document Object Model) DOM是W3C组织推荐的一种解析XML的标准方式。它将XML文档视为一个树形结构,每个节点代表XML文档的一部分。...
常见的 XML 解析器有 DOM、SAX、JDOM 和 DOM4J 等。每种解析器都有其特点和优缺,选择合适的解析器对应用程序的性能和开发效率有很大影响。 1. DOM 解析器 DOM(Document Object Model)是 W3C 官方标准,用于表示...
DOM4J、SAX和DOM是处理XML文档的三种主要解析器或API,它们各有特点,适用于不同的场景。 1. DOM(Document Object Model) DOM是一种将XML文档转换为内存中的树形结构的模型,它允许开发者通过节点层次结构来访问...
本文将深入探讨DOM、DOM4J和SAX三种常用的XML解析方法,并结合具体的实例进行详细讲解。 首先,DOM(Document Object Model)是W3C组织推荐的一种XML解析标准。它将整个XML文档加载到内存中,构建一个树形结构,...
以上四种方式各有优缺点,DOM适合小文件并要求快速访问任何部分,SAX适合大文件但需要实时处理,DOM4J和JDOM提供了更友好的API但可能消耗更多资源。在实际开发中,应根据项目需求选择合适的方法。在提供的"testxml...
【dom4j基础入门文档(SAX,DOM,XPATH)】 dom4j是一个流行的Java库,专门用于处理XML文档。相较于W3C DOM API,dom4j的优势在于它内置了本地XPath支持,使得XML文档的查询和操作更为简便。本文将深入介绍dom4j的...
在Java中,解析XML文件是常见的任务,通常有四种主要的方法:DOM (Document Object Model),JDOM,DOM4J以及SAX (Simple API for XML)。以下是对这四种XML解析方式的详细介绍: 1. DOM解析: DOM是一种树形结构的...
为了处理XML文档,有三种主要的解析方式:DOM、SAX和DOM4J。每种方法都有其特点和适用场景,下面将详细介绍这三种解析方式。 1. DOM(Document Object Model) DOM解析器将整个XML文档加载到内存中,构建一个树形...
对于XML的解析,有多种方法,包括DOM、DOM4J和SAX。以下是关于这三种解析方式的详细介绍: 1. DOM(Document Object Model)解析: DOM是一种树形结构,它将XML文档视为一个对象模型,通过这种方式,程序可以方便...
6. **StAX(Streaming API for XML)支持**:DOM4J也支持StAX解析器,这种解析方式结合了SAX的高效和DOM的易用性,可以在处理大型XML文件时节省内存。 7. **与JAXB集成**:DOM4J可以与Java Architecture for XML ...
本文将详细介绍四种主流的Java XML处理库:DOM4J、DOM、JDOM和SAX,并通过简单的代码示例帮助初学者入门。 1. DOM (Document Object Model) DOM是W3C制定的一种标准,它将XML文档视为一个树形结构,允许开发者通过...
DOM4J是一个强大的Java XML API,它提供了丰富的XML处理功能,包括文档对象模型(DOM)、简单API(SAX)以及事件驱动模型(StAX)。在本篇文章中,我们将深入探讨DOM4J 2.1.3版本,了解其核心特性、用途以及如何利用...
本篇文章将探讨四种处理XML的Java库:DOM、JDOM、SAX和DOM4J,分析它们的原理、性能特点以及适用场景。 首先,我们来了解DOM(Document Object Model)。DOM是W3C组织定义的一种API,它将XML文档解析为一个树形结构...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活、高效的API,使得XML的解析、创建、修改和查询变得简单。这次我们有两个版本的DOM4J库:1.6.1和2.0.0-ALPHA。这两个版本在功能、性能和API设计上都有所...
1. **XML解析**:DOM4J支持多种解析方式,包括SAX解析、DOM解析和DOM4J自己的解析器。SAX解析适用于大文件,因为它按需读取,节省内存;DOM解析则将整个XML文档加载到内存,适合小文件;DOM4J解析器则提供了更灵活的...
首先,DOM4J是一个基于Java的XML处理库,它支持多种XML处理模型,如SAX和DOM。DOM4J的核心特性包括XML文档的构建、解析、查询和修改。它还提供了XPath支持,允许开发者通过简洁的表达式来定位XML文档中的元素。 DOM...