DOM方式
package tigers;
import java.util.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
public class Tiger23 {
static class Bean23 {
Map<String, String> attrs; //标记属性
String name, value; //标记名称和文本内容
public Bean23(String name, String value, Map<String, String> attrs) {
this.name = name;
this.value = value;
this.attrs = attrs;
}
public Map<String, String> getAttrs() {
return attrs;
}
public void setAttrs(Map<String, String> attrs) {
this.attrs = attrs;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String toString() {
Set<String> keySet = attrs.keySet();
String str = "";
for (String key : keySet) {
String value = attrs.get(key);
str += " " + key + "='" + value + "'";
}
return "\nElement:<" + name + ", <" + value + ">" + ",(" + str + ")>";
}
}
static Map<String, String> getElementAttrs(Element element) {
Map<String, String> attrs = new HashMap<String, String>();
if (element.hasAttributes()) {
NamedNodeMap maps = element.getAttributes();
for (int i = 0; i < maps.getLength(); i++) {
Attr attr = (Attr) maps.item(i);
attrs.put(attr.getName(), attr.getValue());
}
}
return attrs;
}
static Collection<Bean23> getElements(Document doc) {
Collection<Bean23> elements = new ArrayList<Bean23> ();
Element rootElement = doc.getDocumentElement();
elements = circle(rootElement, elements);
return elements;
}
static Collection<Bean23> circle(Element element, Collection<Bean23> elements) {
String name = element.getTagName();
String value = "";
Map<String, String> attrs = getElementAttrs(element);
Bean23 bean = new Bean23(name, value, attrs);
elements.add(bean);
NodeList list = element.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
if (node.hasChildNodes()) {
Element childElement = (Element) node;
elements = circle(childElement, elements);
continue;
} else if (node.getNodeType() != Node.COMMENT_NODE && (node.getNodeValue() != null)) {
value += node.getNodeValue().trim();
}
bean.setValue(value);
}
return elements;
}
static Collection<Bean23> parse(String xmlFile) {
Collection<Bean23> elements = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File(xmlFile));
elements = getElements(doc);
} catch (Exception e) {
e.printStackTrace();
}
return elements;
}
public static void main(String[] args) {
Collection<Bean23> elements = new ArrayList<Bean23> ();
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
elements = parse("c:/test.xml");
System.gc();
}
long end = System.currentTimeMillis();
System.out.println("<DOM方式>past time: " + (end - start));
System.out.println(elements);
}
}
SAX方式
package tigers;
import java.util.*;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
import org.xml.sax.XMLReader;
import java.io.*;
import org.xml.sax.InputSource;
public class Tiger22 {
static class Bean22 { //代表XML中的一个标记。
private String uri, localName, qName, value = "";
private Map<String, String> attrs = new HashMap<String, String> (); //当前标记的属性集合
public Bean22(String uri, String localName, String qName, Map<String, String> attrs) {
this.uri = uri;
this.localName = localName;
this.qName = qName;
this.attrs = attrs;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Map getAttrs() {
return attrs;
}
public String getLocalName() {
return localName;
}
public String getQName() {
return qName;
}
public String getUri() {
return uri;
}
public String toString() {
Set<String> keySet = attrs.keySet();
String str = "";
for (String key : keySet) {
String value = attrs.get(key);
str += " " + key + "='" + value + "'";
}
return "\nElement:<" + localName + ", <" + value + ">" + ",(" + str + ")>";
}
}
static class Inner extends DefaultHandler {
private Bean22 currentElement; //当前标记
private String text; //当前标记的文本内容
private Collection<Bean22> elements = new ArrayList<Bean22> (); //存放所有的标记
public Collection<Bean22> parse(String xmlFile) {
try {
XMLReader reader = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
reader.setContentHandler(this);
reader.parse(new InputSource(new FileReader(xmlFile)));
} catch (Exception e) {
e.printStackTrace();
}
return elements;
}
/*这里使用java.util.Map存放属性信息。注意:org.xml.sax.Attributes原本就是集合类型,但由于SAX工作的方式,决定了如果直接使用Attributes存放属性信息,后来解析的标记的属性信息可能覆盖先前解析的标记的属性信息,导致问题出现。所以这里使用Map替代Attributes存放属性信息,可以很好地避免上述问题的发生。*/
public void startElement(String uri, String localName, String qName, Attributes attrs) {
Map<String, String> mapAttrs = new HashMap<String, String> ();
for (int i = 0; i < attrs.getLength(); i++) {
mapAttrs.put(attrs.getQName(i), attrs.getValue(i));
}
currentElement = new Bean22(uri, localName, qName, mapAttrs);
elements.add(currentElement);
text = new String();
}
public void characters(char[] ch, int start, int end) {
text += new String(ch, start, end).trim();
currentElement.setValue(text);
}
public void endElement(String uri, String localName, String qName) {
//不需要实现任何代码。
}
}
public static void main(String[] args) {
Collection<Bean22> elements = new ArrayList<Bean22> ();
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
Inner in = new Inner();
elements = in.parse("c:/test.xml");
System.gc();
}
long end = System.currentTimeMillis();
System.out.println("<SAX方式>past time: " + (end - start));
System.out.println(elements);
}
}
测试文件及测试结果
c:/test.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<elements id="001">
<!-- element Comment -->
<element name="aaaa">
AAAAAAAAA
</element>
<element name="bbbb">
BBBBBBBBB
</element>
</elements>
<mappings>
<mapping id="1234" elementName="aaaa">
11223344
</mapping>
<mapping id="5678" elementName="aaaa">
55667788
</mapping>
</mappings>
</root>
结果:
<SAX方式>past time: 5750
[
Element:<root, <>,()>,
Element:<elements, <>,( id='001')>,
Element:<element, <AAAAAAAAA>,( name='aaaa')>,
Element:<element, <BBBBBBBBB>,( name='bbbb')>,
Element:<mappings, <>,()>,
Element:<mapping, <11223344>,( elementName='aaaa' id='1234')>,
Element:<mapping, <55667788>,( elementName='aaaa' id='5678')>]
结果:
<DOM方式>past time: 5907
[
Element:<root, <>,()>,
Element:<elements, <>,( id='001')>,
Element:<element, <AAAAAAAAA>,( name='aaaa')>,
Element:<element, <BBBBBBBBB>,( name='bbbb')>,
Element:<mappings, <>,()>,
Element:<mapping, <11223344>,( elementName='aaaa' id='1234')>,
Element:<mapping, <55667788>,( elementName='aaaa' id='5678')>]
结论:
1、使用任何一种方式,第一次解析时都比较耗时,连续解析多次后平均所用时间有很大减少。
2、对于小文件,两者看不出很大差别,SAX甚至比DOM更耗时;文件越大,SAX的优势越大。
3、就编程难度而言,SAX比DOM更容易实现。
分享到:
相关推荐
DOM(Document Object Model)解析和SAX(Simple API for XML)解析是两种常见的XML文档解析方式,它们在处理XML数据时有不同的策略和优缺点。 DOM解析是一种基于树型结构的XML解析方法。当一个XML文档被DOM解析器...
总结起来,dom4j库提供了DOM和SAX两种XML解析方式,而SAX解析在处理大文件时具有性能优势。通过注册事件处理器,开发者可以在解析过程中动态响应XML结构,实现灵活的数据处理。在实际工作中,选择合适的解析方法取决...
### SAX与DOM之间的区别 #### 一、概述 在处理XML文档时,开发人员面临着一个基本的选择:使用DOM(文档对象模型)还是SAX(简单的API for XML)。这两种方法各有优势,选择哪一种取决于具体的应用场景和技术需求...
java中四种操作(dom、sax、jdom、dom4j)xml方式详解与
XML 解析器原理及性能比较 XML 解析器是指将 XML 文档转换为计算机可以理解的格式的软件组件。常见的 XML 解析器有 DOM、SAX、JDOM 和 DOM4J 等。每种解析器都有其特点和优缺,选择合适的解析器对应用程序的性能和...
在Java中,解析XML文件是常见的任务,通常有DOM(Document Object Model)和SAX(Simple API for XML)两种主流的解析方式。本教程将深入探讨Dom4J和SAX两种解析器在处理XML时的使用方法和特点。 **DOM解析**: DOM...
与DOM不同,SAX是一种事件驱动的解析方式。它不会一次性加载整个XML文档,而是逐行读取,遇到开始标签、结束标签、属性等事件时,会触发相应的回调函数。这种方式节省了内存,但操作XML数据相对繁琐,因为需要编写...
DOM与SAX入门,适合初学者,理解DOM与SAX,进而web前端开发。
与DOM不同,SAX是基于事件驱动的解析器,它逐行读取XML文档,遇到每个元素、属性或文本时触发相应的事件回调。这种方式节省内存,适合处理大型XML文件。在SAX中,你需要定义一个实现`DefaultHandler`接口的类,然后...
为了处理XML文档,有三种主要的解析方式:DOM、SAX和DOM4J。每种方法都有其特点和适用场景,下面将详细介绍这三种解析方式。 1. DOM(Document Object Model) DOM解析器将整个XML文档加载到内存中,构建一个树形...
本篇文章将探讨四种处理XML的Java库:DOM、JDOM、SAX和DOM4J,分析它们的原理、性能特点以及适用场景。 首先,我们来了解DOM(Document Object Model)。DOM是W3C组织定义的一种API,它将XML文档解析为一个树形结构...
Java解析XML的三种方式 Ø Android中,解析Xml数据的三种方式: Ø 1、DOM(org.w3c.dom) Ø “文档对象模型”方式,解析完的Xml将生成一个树状结构的对象。...Ø 类似于SAX方式,程序以“拉取”的方式对Xml进行解析。
总之,DOM4J结合SAX解析XML为处理大文件提供了一种高效且内存友好的方式。通过创建SAXReader,设置事件监听器,然后解析XML文件,你可以实现对XML文档的流式处理,从而在处理大量数据时避免内存瓶颈。
本文将深入探讨DOM、SAX、JDom和dom4j四种流行的Java XML解析器,以及它们在处理XML文档时的特点和用法。 1. DOM(Document Object Model) DOM是W3C推荐的一种解析XML的标准方法。它将XML文档表示为一个树形结构,...
Java 解析 XML 文件的 DOM 和 SAX 方式 Java 解析 XML 文件的 DOM 和 SAX 方式是指在 Java 中使用 Document Object Model(DOM)和 Simple API for XML(SAX)两种方式来解析 XML 文件的技术。下面将详细介绍这两种...
本程序的核心是利用DOM、DOM4J和SAX三种不同的方式解析XML文档,每种方法都有其独特的优势和适用场景。 1. DOM解析: DOM(Document Object Model)是一种将XML文档转换为内存中树形结构的模型。它将XML文件加载到...
在Java中,有多种方式可以解析XML文档,其中最常用的是DOM(Document Object Model)和SAX(Simple API for XML)。本篇文章将详细介绍DOM和SAX解析XML的方法,并通过提供的`DomDemo.java`和`SaxDemo.java`示例代码...
XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于网络应用程序的数据交换和存储。DOM(Document Object ...通过比较它们的实现和性能,可以更好地理解DOM和SAX的区别,并在实际开发中灵活应用。
SAX是一种事件驱动的XML解析器,与DOM不同,它不将整个XML文档加载到内存中,而是逐行读取文档,遇到元素、属性等事件时触发回调函数。这种流式解析方式节省了内存,适合处理大型或无限长度的XML数据流。然而,SAX...
### DOM与SAX比较及选择 #### 一、概述 在处理XML文档时,开发者面临着多种解析技术的选择,包括DOM(Document Object Model)、SAX(Simple API for XML)、JDOM等。其中,DOM和SAX是最常用且重要的两种方式。...