当前位置:文档之家› 四种XML解析器比较

四种XML解析器比较

四种XML解析器比较
四种XML解析器比较

1.详解

1)DOM(JAXP Crimson解析器)

DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。

2)SAX

SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。

而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。

选择DOM还是选择SAX?对于需要自己编写代码来处理XML文档的开发人员来说,选择DOM 还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。

DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。

SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

3)JDOM https://www.doczj.com/doc/1b16805372.html,

JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。正在考虑通过“Java规范请求JSR-102”

将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。

JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。

JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。JDOM对于大多数Java/XML应用程序来说当然是有用的,并且大多数开

发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。

JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM

模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。

4)DOM4J https://www.doczj.com/doc/1b16805372.html,

虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具

有并行访问功能。从2000下半年开始,它就一直处于开发之中。

为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。

在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。

DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J.

2。比较

1)DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.

2)JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM.虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基

于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。

3)SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML 流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。

3. 四种xml操作方式的基本使用方法

xml文件:

Xml代码

1.weideweihttp://

https://www.doczj.com/doc/1b16805372.html,flyinghttp://user.qzon

https://www.doczj.com/doc/1b16805372.html,/94611981

程序代码:

Java代码

1.import java.io.File;

2.import java.util.Iterator;

3.import java.util.List;

4.

5.import javax.xml.parsers.DocumentBuilder;

6.import javax.xml.parsers.DocumentBuilderFactory;

7.import javax.xml.parsers.SAXParser;

8.import javax.xml.parsers.SAXParserFactory;

9.

10.import org.dom4j.io.SAXReader;

11.import org.jdom.Element;

12.import org.jdom.input.SAXBuilder;

13.import org.w3c.dom.Document;

14.import org.w3c.dom.NodeList;

15.import org.xml.sax.Attributes;

16.import org.xml.sax.InputSource;

17.import org.xml.sax.SAXException;

18.import org.xml.sax.helpers.DefaultHandler;

19.

20.public class MyXMLReader extends DefaultHandler {

21.

22. java.util.Stack tags = new java.util.Stack();

23. public MyXMLReader() {

24. super();

25. }

26. /**

27. * DOM方式

28. * @since V2.0

29. * @author David.Wei

30. * @date 2008-4-11

31. * @return void

32. */

33. public void DOM() {

34. long lasting = System.currentTimeMillis();

35.

36. try {

37. File f = new File("F:/xmltest.xml");

38. DocumentBuilderFactory factory = DocumentBuilderFactory

39. .newInstance();

40. DocumentBuilder builder = factory.newDocumentBuilder();

41. Document doc = builder.parse(f);

42. NodeList nl = doc.getElementsByTagName("node");

43. for (int i = 0; i < nl.getLength(); i++) {

44. System.out.println("|| Name: |"

45. + doc.getElementsByTagName("name").item(i)

46. .getFirstChild().getNodeValue());

47. System.out.println("||Space: |"

48. + doc.getElementsByTagName("space").item(i)

49. .getFirstChild().getNodeValue());

50. System.out.println("------------------------------------------------

-"); }

51. } catch (Exception e) {

52. e.printStackTrace();

53. }

54. System.out.println("DOM RUNTIME:"

55. + (System.currentTimeMillis() - lasting) + " MS");

56. }

57.

58.

59.

60. /**

61. * SAX方式

62. * @since V2.0

63. * @author David.Wei

64. * @date 2008-4-11

65. * @return void

66. */

67. public void SAX() {

68.

69. long lasting = System.currentTimeMillis();

70. try {

71. SAXParserFactory sf = SAXParserFactory.newInstance();

72. SAXParser sp = sf.newSAXParser();

73. MyXMLReader reader = new MyXMLReader();

74. sp.parse(new InputSource("F:/xmltest.xml"), reader);

75. } catch (Exception e) {

76. e.printStackTrace();

77. }

78. System.out.println("SAX RUNTIME:"

79. + (System.currentTimeMillis() - lasting) + " MS");

80. }

81.

82. public void startElement(String uri, String localName, String qName,

83. Attributes attrs) {

84. tags.push(qName);

85. }

86.

87. public void characters(char ch[], int start, int length)

88. throws SAXException {

89. String tag = (String) tags.peek();

90. if (tag.equals("name")) {

91. System.out.println("|| Name: |" + new String(ch, start, length));

92. }

93. if (tag.equals("space")) {

94. System.out.println("||Space: |" + new String(ch, start, length));

95. }

96. System.out.println("-------------------------------------------------");

97. }

98.

99. /**

100. * JDOM方式

101. * @since V2.0

102. * @author David.Wei

103. * @date 2008-4-11

104. * @return void

105. */

106. public void JDOM() {

107. long lasting = System.currentTimeMillis();

108. try {

109. SAXBuilder builder = new SAXBuilder();

110. org.jdom.Document doc = builder.build(new File("F:/xmltest.xml")); 111. Element foo = doc.getRootElement();

112. List allChildren = foo.getChildren();

113. for (int i = 0; i < allChildren.size(); i++) {

114. System.out.println("|| Name: |"

115. + ((Element) allChildren.get(i)).getChild("name")

116. .getText());

117. System.out.println("||Space: |"

118. + ((Element) allChildren.get(i)).getChild("space")

119. .getText());

120. System.out.println("-------------------------------------------------"); }

121. } catch (Exception e) {

122. e.printStackTrace();

123. }

124. System.out.println("JDOM RUNTIME:"

125. + (System.currentTimeMillis() - lasting) + " MS");

126. }

127.

128. /**

129. * DOM4J方式

130. * @since V2.0

131. * @author David.Wei

132. * @date 2008-4-11

133. * @return void

134. */

135. public void DOM4J() {

136. long lasting = System.currentTimeMillis();

137. try {

138. File f = new File("F:/xmltest.xml");

139. SAXReader reader = new SAXReader();

140. org.dom4j.Document doc = reader.read(f);

141. org.dom4j.Element root = doc.getRootElement();

142. org.dom4j.Element foo;

143. for (Iterator i = root.elementIterator("node"); i.hasNext();) { 144. foo = (org.dom4j.Element) i.next();

145. System.out.println("|| Name: |" + foo.elementText("name")); 146. System.out.println("||Space: |" + foo.elementText("space")); 147. System.out.println("-------------------------------------------------");

148. }

149. } catch (Exception e) {

150. e.printStackTrace();

151. }

152. System.out.println("DOM4J RUNTIME:"

153. + (System.currentTimeMillis() - lasting) + " MS");

154. }

155.

156. public static void main(String arge[]) {

157. MyXMLReader myXML = new MyXMLReader();

158. System.out.println("=====================DOM========================="); 159. myXML.DOM();

160. System.out.println("=====================SAX========================="); 161. myXML.SAX();

162. System.out.println("=====================JDOM========================"); 163. myXML.JDOM();

164. System.out.println("=====================DOM4J=======================");

165. myXML.DOM4J();

166. System.out.println("=================================================");

167. }

168.}

运行结果:

Html代码

1.=====================DOM=========================

2.|| Name: |weidewei

3.||Space: |https://www.doczj.com/doc/1b16805372.html,

4.-------------------------------------------------

5.|| Name: |flying

6.||Space: |https://www.doczj.com/doc/1b16805372.html,/94611981

7.-------------------------------------------------

8.DOM RUNTIME:62 MS

9.=====================SAX=========================

10.|| Name: |weidewei

11.-------------------------------------------------

12.||Space: |https://www.doczj.com/doc/1b16805372.html,

13.-------------------------------------------------

14.|| Name: |flying

15.-------------------------------------------------

16.||Space: |https://www.doczj.com/doc/1b16805372.html,/94611981

17.-------------------------------------------------

18.SAX RUNTIME:16 MS

19.=====================JDOM========================

20.|| Name: |weidewei

21.||Space: |https://www.doczj.com/doc/1b16805372.html,

22.-------------------------------------------------

23.|| Name: |flying

24.||Space: |https://www.doczj.com/doc/1b16805372.html,/94611981

25.-------------------------------------------------

26.JDOM RUNTIME:78 MS

27.=====================DOM4J=======================

28.|| Name: |weidewei

29.||Space: |https://www.doczj.com/doc/1b16805372.html,

30.-------------------------------------------------

31.|| Name: |flying

32.||Space: |https://www.doczj.com/doc/1b16805372.html,/94611981

33.-------------------------------------------------

34.DOM4J RUNTIME:78 MS

35.=================================================

运行时如果有错误可能原因(我碰到的就这两个,解决了就OK了):

1.错误现象: Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.

解决办法:xml文件换行问题,编写xml文件时不要换行就可以了.

2.dom4j

错误现象: org.dom4j.DocumentException: Error on line 1 of document : Content is not allowed in prolog.

解决方法:dom4j的jar包使用dom4j1.6就可以了.

java_Dom4j解析XML详解

学习:Dom4j 1、DOM4J简介 DOM4J是https://www.doczj.com/doc/1b16805372.html, 出品的一个开源XML 解析包。DOM4J应用于Java 平台,采用了Java 集合框架并完全支持DOM,SAX 和JAXP。 DOM4J 使用起来非常简单。只要你了解基本的XML-DOM 模型,就能使用。 Dom:把整个文档作为一个对象。 DOM4J 最大的特色是使用大量的接口。它的主要接口都在org.dom4j里面定义:

接口之间的继承关系如下: interface https://www.doczj.com/doc/1b16805372.html,ng.Cloneable interface org.dom4j.Node interface org.dom4j.Attribute interface org.dom4j.Branch interface org.dom4j.Document interface org.dom4j.Element interface org.dom4j.CharacterData interface org.dom4j.CDATA interface https://www.doczj.com/doc/1b16805372.html,ment interface org.dom4j.Text interface org.dom4j.DocumentType interface org.dom4j.Entity interface org.dom4j.ProcessingInstruction 2、XML文档操作1 2.1、读取XML文档: 读写XML文档主要依赖于org.dom4j.io包,有DOMReader和SAXReader两种方式。因为利用了相同的接口,它们的调用方式是一样的。 public static Docum ent load(String filenam e) { Document docum ent =null; try { SAXReader saxReader = new SAXReader(); docum ent =saxReader.read(new File(filename)); //读取XML文件,获得docum ent 对象 } catch (Exception ex) { ex.printStackTrace();

Python解析XML的三种方式

一、什么是 XML? XML 被设计用来传输和存储数据。它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。 准备一个解析用的xml如下: 1 laoz 老曾 30 https://www.doczj.com/doc/1b16805372.html, 我是老曾 2 qz 强子 30 https://www.doczj.com/doc/1b16805372.html, 我是强子 1、第一行是 XML 声明 它定义 XML 的版本(1.0)和所使用的编码(utf-8 : 万国码, 可显示各种语言) 2、必须包含根元素(有且只有一个) 该元素是所有其他元素的父元素,这里的根元素是Data ..

所有的都被包含在里面 3、元素开始标签必须要有结束标签 < account > 元素有 6个子元素:、< description > 每个元素都有对应的关闭标签(跟HTML不一样,有一些是不需要关闭的,比如,
) 4、XML 标签对大小写敏感 比如是不一样的 5、XML 属性值必须加引号 < account name=laoz>这样会报错的,必须"laoz"才行 二、Python 对 XML 的解析 Python 有三种方法解析 XML,SAX,DOM,以及 ElementTree。 DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。 1、利用DOM解析XML 一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。

XML报文解析测试

XML报文解析测试 在平时工作中,难免会遇到把 XML 作为数据存储格式。面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML 是工作中使用最多的(至少我认为)。 预备 测试环境: AMD 毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server SP4、Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8,在 Debug 模式下测试。 XML 文件格式如下: <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> <NO>A1234</NO> <ADDR>四川省XX县XX镇XX路X段XX号</ADDR> </VALUE> <VALUE> <NO>B1234</NO> <ADDR>四川省XX市XX乡XX村XX组</ADDR> </VALUE> </RESULT> 测试方法: 采用 JSP 端调用Bean(至于为什么采用JSP来调用,请参考: https://www.doczj.com/doc/1b16805372.html,/rosen/archive/2004/10/15/138324.aspx),让每一种方案分别解析10K、100K、1000K、10000K的 XML 文件,计算其消耗时间(单位:毫秒)。 JSP 文件: <%@ page contentType="text/html; charset=gb2312" %> <%@ page import="com.test.*"%> <html> <body> <% String args[]={""}; MyXMLReader.main(args); %>

VC++ xml解析

三种最流行的开放源码XML 库是expat、libxml 和Xerces。 第一部分:DOM解析: 概述:DOM解析将会把一个完整的XML文档读进来,生成一个结构树。这样会要把XML文档全部都加载到内在中。所以解析起来的速度会要慢一些。 1、如何加载xml文件: //创建DOM,加载XML文档 MSXML::IXMLDOMDocumentPtr pCommandDoc; pCommandDoc.CreateInstance(__uuidof(MSXML::DOMDocument)); pCommandDoc->put_async(V ARIANT_FALSE); pCommandDoc->put_validateOnParse(VARIANT_FALSE); pCommandDoc->put_resolveExternals(V ARIANT_FALSE); pCommandDoc->put_preserveWhiteSpace(V ARIANT_TRUE); pCommandDoc->load(file.GetBuffer(0)); 2、在XML文档中查找指定的结点: //找到 MSXML::IXMLDOMNodePtr pRootNode=pCommandDoc->selectSingleNode("root/record"); if (pRootNode==NULL) { return ; } 3、得到XML文档中,结点的属性 CString strTemp; MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL; pRootNode->get_attributes(&pAttrs); if (pAttrs==NULL) { return; } MSXML::IXMLDOMNodePtr pRequestTypeAttr=pAttrs->getQualifiedItem("name",""); _bstr_t strRequestType=pRequestTypeAttr->Gettext(); strTemp=strRequestType.operator char *(); 4、得到结点的内容 _bstr_t strVisiPort=pNode->Gettext(); 5、设置结点的内容 HRESULT hr=pNode->put_text(_bstr_t(m_strGatewayPassword)); 6、设置一个属性内容 IXMLDOMAttribute *pa=NULL; bstr = SysAllocString(L"属性1"); pXMLDom->createAttribute(bstr,&pNode); var = VariantString(L"strin"); pa->put_value(var); pRoot->setAttributeNode(pa, &pa1); 第二部分、如何使用SAX解析

四种XML解析器比较

1.详解 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。 2)SAX SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。 而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。 选择DOM还是选择SAX?对于需要自己编写代码来处理XML文档的开发人员来说,选择DOM 还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。 DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。 SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。 3)JDOM https://www.doczj.com/doc/1b16805372.html, JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。正在考虑通过“Java规范请求JSR-102” 将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。 JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。 JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。JDOM对于大多数Java/XML应用程序来说当然是有用的,并且大多数开

XML创建与解析常用方法介绍

XML解析方式介绍 1.DOM4J(Document Object Model for Java) 虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始,它就一直处于开发之中。 为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections 类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。 在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java 开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。 DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J. 【优点】 ①大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。 ②支持XPath。 ③有很好的性能。 【缺点】 ①大量使用了接口,API较为复杂。 2.SAX(Simple API for XML) SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。 选择DOM还是选择SAX?对于需要自己编写代码来处理XML文档的开发人员来说,选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX 采用的是事件模型。

SAX解析XML原理

SAX是一个用于处理XML事件驱动的“推”模型,虽然它不是 W3C标准,但它却是一个得到了广泛认可的API。SAX解析器不像DOM那样建立一个完整的文档树,而是在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。 常见的事件处理器有三种基本类型: ● 用于访问XML DTD内容的DTDHandler; ● 用于低级访问解析错误的ErrorHandler; ● 用于访问文档内容的ContentHandler,这也是最普遍使用的事件处理器。 图 2显示了SAX解析器如何通过一个回调机制报告事件。解析器读取输入文档并在处理文档时将每个事件推给文档处理器(MyContentHandler)。 与DOM相比,SAX解析器能提供更好的性能优势,它提供对XML文档内容的有效低级访问。SAX模型最大的优点是内存消耗小,因为整个文档无需一次加载到内存中,这使SAX解析器可以解析大于系统内存的文档。另外,你无需像在DOM中那样为所有节点创建对象。最后,SAX“推”模型可用于广播环境,能够同时注册多个ContentHandler,并行接收事件,而不是在一个管道中一个接一个地进行处理。 SAX的缺点是你必须实现多个事件处理程序以便能够处理所有到来的事件,同时你还必须在应用程序代码中维护这个事件状态,因为SAX解析器不能交流元信息,如DOM的父/子支持,所以你必须跟踪解析器处在文档层次的哪个位置。如此一来,你的文档越复杂,你的应用逻辑就越复杂。虽然没有必要一次将整个文档加载到内存中,但SAX解析器仍然需要解析整个文档,这点和DOM一样。 也许SAX面临的最大问题是它没有内置如XPath所提供的那些导航支持。再加上它的单遍解析,使它不能支持随机访问。这一限制也表现在名字空间上: 对有继承名字空间的元素不做注解。这些限制使SAX很少被用于操作或修改文档。 那些只需要单遍读取内容的应用程序可以从SAX解析中大大受益。很多B2B和EAI应用程序将XML用做封装格式,接收端用这种格式简单地接收所有数据。这就是SAX明显优于DOM的地方:因高效而获得高吞吐率。在SAX 2.0 中有一个内置的过滤机制,可以很轻松地输出一个文档子集或进行简单的文档转换。

Java解析XML文件

Java解析XML文件 ========================================== xml文件 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> <NO>A1234</NO> <ADDR>四川省XX县XX镇XX路X段XX号</ADDR> </VALUE> <VALUE> <NO>B1234</NO> <ADDR>四川省XX市XX乡XX村XX组</ADDR> </VALUE> </RESULT> ========================================== 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。 import java.io.*; import java.util.*; import org.w3c.dom.*; import javax.xml.parsers.*; public class MyXMLReader{ public static void main(String arge[]){ long lasting =System.currentTimeMillis(); try{ File f=new File("data_10k.xml"); DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document doc = builder.parse(f); NodeList nl = doc.getElementsByT agName("VALUE"); for (int i=0;i<nl.getLength();i++){ System.out.print("车牌号码:" +

XML的四种解析器(dom,sax,jdom,dom4j)原理及性能比较[收藏]

1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。 2)SAX SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。 选择DOM还是选择SAX?对于需要自己编写代码来处理XML文档的开发人员来说,选择DOM还是SAX解析模型是一个非常重要的设计决策。DOM 采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。 DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然

后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。 SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。 3)JDOM https://www.doczj.com/doc/1b16805372.html,/ JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。正在考虑通过“Java规范请求JSR-102”将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。 JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。

xml的四种解析方法及源代码

xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J) 第一种:SAX解析 SAX处理机制:SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。 测试用的xml文件:db.xml Xml代码 oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@localhost:1521:oracle scott tiger DTD文件db.dtd Xml代码

SAX解析实例一 org.xml.sax.DefalutHandler类: 可以扩展该类,给出自己的解析实现SAXPrinter.java Java代码 import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXPrinter extends DefaultHandler { /** *//** * 文档开始事件 */ public void startDocument() throws SAXException { System.out.println("");

XML解析器的设计与实现

电脑编程技巧与维护 XML (可扩展标记语言)是WWW 联盟定义的元语言,已成为互连网数据交换的标准。XML 具有广泛的用途,不仅被用于数据交换也经常被用于定义各种配置文件。XML 文件只是以纯文本对数据进行编码的一种格式,使用XML 文件中所编码的数据之前,必须先将数据从纯文本中解析出来。因此,XML 解析器在信息系统的构建过程中十分重要。 当前流行的XML 解析方法可以分为两类模型:SAX 和DOM 。SAX 是一个用于处理XML 事件驱动的“推”模型,虽然它不是W3C 标准,但它却得到了广泛的认可。SAX 解析器不像DOM 那样建立一个完整的文档树,而是在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。DOM 是以层次结构组织的节点或信息片断的集合,是一种基于树解析方法。DOM 具有几个优点:由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构做更改;还可以在任何时候在树中上下导航,而不是像SAX 那样是一次性处理。 1XML 语法 XML 文件中通常包含下列基本元素:标记名、属性名、 属性值、文本值和各种定界符号如“<”,“>“等。标记名和属性名是符合一定命名规则的字符串。属性值和文本值可以是符合一定命名规则字符串,也可以是任意字符串。例如语句example中,“item ”是标记名,“name ”是属性名,“wang ”是属性值,“example ”是文本值。由这些基本元素可以组成3类不同的句型。句型1是由符号“<”、标记名、属性组(可选)、符号“>”组成,例如“”、“”均为句型1。句型2是由符号“<”、标记名、属性组、符号“/”、符号“>”组成,例如““为句型2。句型3由符号“<”、符号“/”、标记名、符号“>”组成,例如“”为句型3。一个合法的XML 文件就是由上述3类句型和文本值按照特定句法组成的文本。 分别用A 、B 、C 表示句型1、句型1、句型3,用a 、b 、c 、d 表示标记名、属性名、属性值、文本值,用S 表示文档,用W 表示句子集合,用T 表示属性集,则XML 语法可用如下文法表示: 1 S =>AWC 2W =>AWCW |BW |AdCW 3W =>AdC |B 4A =>|5B =>6C => 7T => b=cT |b=c 例如,给定如下的XML 文件,可得到图1语法树。 XML 解析器的设计与实现 王克伟,胡立东 (邳州市车辐中等专业学校,邳州221344) 摘要:基于DOM XML 标准编程实现了一个解析器,可以从XML 文件中构造出一棵节点树,而后根据需要可以添加各种操作。证明了解析器设计的正确性。关键词:XML ;文法;解析器 Design and Implementation of XML Parser WANG Kewei ,HU Lidong (CheFu Professional School of Pizhou City ,Pizhou 221344) Abstract :In the paper,a XML parser is realized based on DOM XML specification.It can constructs a XML tree from XML file.If needed,other operations on the XML tree can be added.It has been proved that the Parser design in the paper is valid. Key words :XML ;Grammar ;Parser 作者简介:王克伟(1978-),男,硕士,研究方向:教育管理;胡立东(1980-),男,硕士,研究方向:数据库管理。收稿日期: 2010-10-10 图1 38--

jdom读取解析XML文件

jdom学习读取XML文件 用JDOM读取XML文件需先用org.jdom.input.SAXBuilder对象的build()方法创建Document对象,然后用Document类、Element类等的方法读取所需的内容。 例如: 8G 200 1580 10G 500 3000 则解析类: import java.util.*; import org.jdom.*; import org.jdom.input.SAXBuilder; publicclass Sample { publicstaticvoid main(String[] args) throws Exception{ SAXBuildersb=new SAXBuilder(); Document doc=sb.build(Sample.class.getClassLoader().getResourceAsStream("test. xml")); //构造文档对象 Element root=doc.getRootElement(); //获取根元素 List list=root.getChildren("disk");//取名字为disk的所有元素 for(int i=0;i

xml文件解析

查找结点,读取结点属性------------------------------------------------------ 获取结点的属性------------------------------------- 设置结点的属性------------------------------------------------ 给结点添加新属性------------------------------------------- 设置一个结点的内容---------------------------------------------------- 添加新节点---------------------------------------------------- 编码问题------------------------------------------------------------------ XML树: John Fleck June 2, 2002 example keyword This is the headline This is the body text. 1:查找结点 #include #include #include #include #include Void parseStory (xmlDocPtr doc, xmlNodePtr cur) { xmlChar *key; cur = cur->xmlChildrenNode; while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword")))

java解析XML详解

详解Java解析XML的四种方法 XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),具体可参阅w3c官方网站文档https://www.doczj.com/doc/1b16805372.html,获取更多信息。 XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。基本的解析方式有两种,一种叫SAX,另一种叫DOM。SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。假设我们XML的内容和结构如下: ddviplinux m 30 本文使用JAVA语言来实现DOM与SAX的XML文档生成与解析。 首先定义一个操作XML文档的接口XmlDocument 它定义了XML文档的建立与解析的接口。 package com.alisoft.facepay.framework.bean; /** * * @author hongliang.dinghl * 定义XML文档建立与解析的接口 */ public interface XmlDocument { /** * 建立XML文档 * @param fileName 文件全路径名称 */ public void createXml(String fileName); /** * 解析XML文档 * @param fileName 文件全路径名称 */ public void parserXml(String fileName); } 1. DOM生成和解析XML文档 为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。 import java.io.FileInputStream; import java.io.FileNotFoundException;

oracle解析xml或clob过程

1、f_Parserclob --将传入的xml Clob对象解释成一个二维数组 Function f_Parserclob(Xml Clob) Return t_Ttab_Elem Is p Xmlparser.Parser; Element t_Tab_Xmlelem; Begin --这里xml的整个解析过程可以理解为java解析xml的过程 If Trim(Xml) Is Not Null Then p := Xmlparser.Newparser;--创建一个解析器,理解为解析对象 Xmlparser.Setvalidationmode(p, False);--设置验证模式 Xmlparser.Parseclob(p, Xml);--把xml放入解析器 Element := f_Setxmlelem(p);--下面有此方法说明 Xmlparser.Freeparser(p); End If; Return f_Change_Twoarray(Element); End; 2、f_Setxmlelem --将xml解释成一个列属性记录的集合 -- t_Tab_Xmlelem只是一个自定义变量,下面有说明: Function f_Setxmlelem(p Xmlparser.Parser) Return t_Tab_Xmlelem Is Doc Xmldom.Domdocument;--文档 Nl Xmldom.Domnodelist; --节点 Nlc Xmldom.Domnodelist; n Xmldom.Domnode; e Xmldom.Domelement; Nnm Xmldom.Domnamednodemap; Len1 Number; Len2 Number; Rownum Number; Elemnum Number := 0; Nname Varchar2(32767); Nvalue Varchar2(32767); Ntype Varchar2(32767); Element t_Tab_Xmlelem; Begin Doc := Xmlparser.Getdocument(p);--获取整个xml -- get all elements

java解析XMl文件完整版DOM解析XML

package XML; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class DomTest { private Document doc;

//获得DOM树,元素的添加删除都会用到DOM树所以抽出一个方法来 public void document(){ try { // 1.创建解析工厂对象 DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); // 2.通过解析器工厂对象创建解析器对象 DocumentBuilder document = factory.newDocumentBuilder(); // 3.指定解析XML文件,parse("路径")里面写的是文件的路径,并不是文件名。我这里是在这个项目里面,所有写的是相对路径。 doc = document.parse("NewFile.xml"); } catch (Exception e) { } } //解析XML文件

SAP abap中xml解析函数

XML解析函数 FUNCTION zmmjyh_xml2table. *"-----------------------------------------------------------------*"*"Local interface: *" IMPORTING *" REFERENCE(INPUT) TYPE STRING *" EXPORTING *" REFERENCE(RETCODE) TYPE I *" TABLES *" I_TABLE STRUCTURE ZMMJYH_CDIF *"------------------------------------------------------------- * I_TABLE返回字段、字段值列表. * Global data declarations TYPE-POOLS: ixml. TYPES: BEGIN OF t_xml_line , data(256) TYPE x, END OF t_xml_line. DATA: l_ixml TYPE REF TO if_ixml, l_streamfactory TYPE REF TO if_ixml_stream_factory, l_parser TYPE REF TO if_ixml_parser, l_istream TYPE REF TO if_ixml_istream, l_document TYPE REF TO if_ixml_document, l_node TYPE REF TO if_ixml_node, l_xmldata TYPE string. DATA: l_elem TYPE REF TO if_ixml_element, l_root_node TYPE REF TO if_ixml_node, l_next_node TYPE REF TO if_ixml_node, l_name TYPE string, l_iterator TYPE REF TO if_ixml_node_iterator. DATA: l_xml_table TYPE TABLE OF t_xml_line, l_xml_line TYPE t_xml_line, l_xml_table_size TYPE i. * Creating the main iXML factory l_ixml = cl_ixml=>create( ). * Creating a stream factorya l_streamfactory = l_ixml->create_stream_factory( ). l_istream = l_streamfactory->create_istream_string( string = input ). * Creating a document l_document = l_ixml->create_document( ). * Create a Parser l_parser = l_ixml->create_parser( stream_factory = l_streamfactory istream = l_istream document = l_document ).

相关主题
文本预览
相关文档 最新文档