XML的四种解析器(dom,sax,jdom,dom4j)原理及性能比较[收藏]
java_Dom4j解析XML详解
学习:Dom4j1、DOM4J简介DOM4J是 出品的一个开源XML 解析包。
DOM4J应用于Java 平台,采用了Java 集合框架并完全支持DOM,SAX 和JAXP。
DOM4J 使用起来非常简单。
只要你了解基本的XML-DOM 模型,就能使用。
Dom:把整个文档作为一个对象。
DOM4J 最大的特色是使用大量的接口。
它的主要接口都在org.dom4j里面定义:接口之间的继承关系如下:interface ng.Cloneableinterface org.dom4j.Nodeinterface org.dom4j.Attributeinterface org.dom4j.Branchinterface org.dom4j.Documentinterface org.dom4j.Elementinterface org.dom4j.CharacterDatainterface org.dom4j.CDATAinterface mentinterface org.dom4j.Textinterface org.dom4j.DocumentTypeinterface org.dom4j.Entityinterface org.dom4j.ProcessingInstruction2、XML文档操作12.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();}return docum ent;}或public static Docum ent load(URL url) {Document docum ent =null;try {SAXReader saxReader = new SAXReader();docum ent =saxReader.read(url); //读取XML文件,获得docum ent对象} catch (Exception ex) {ex.printStackTrace();}return docum ent;}//读取指定的xml文件之后返回一个Document对象,这个对象代表了整个XML文档,用于各种Do m运算。
XML解析原理
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(xml路径);
NodeList list=document.getElementByTagName(XML文档中的标签元素(第一个根节点或是子节点));
Node node=list.item(0);
String content=node.getTextContent();
System.out.println(content);
XML编程(CRUD)-----create read update delete
XML解析技术概述
XML解析方式分为两种:dom和sax
dom:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式
sax:(Simple API for xml)不是官方标准,但他是XML社区事实上的标准,几乎所有的XML解析器都支持他
JAXP
JAXP开发包是J2SE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包组成
在Java.xml.parsers包中,定义了几个工厂类,程序员调用这些工厂,可以得到XML文档的DOM
或SAX的解析器,从而实现对XML文档的解析 Biblioteka 读取XML文档中的值代码:
XML解析开发包:Jaxp(sun) Jdom、dom4j
dom和sax解析方法的区别
JavaXML解析的四种方法(连载)
JavaXML解析的四种⽅法(连载)1. xml简介 XML:指可扩展标记语⾔, Extensible Markup Language;类似HTML。
XML的设计宗旨是传输数据,⽽⾮显⽰数据。
⼀个xml⽂档实例:1 <?xml version="1.0" encoding="UTF-8"?>2 <company name="Tencent" address="深圳市南⼭区">3 <department deptNo="001" name="development">4 <employee id="devHead" position="minister">许刚</employee>5 <employee position="developer">⼯程师A</employee>6 </department>7 <department deptNo="002" name="education">8 <employee position="minister" telephone="1234567">申林</employee>9 <employee position="trainee">实习⽣A</employee>10 </department>11 </company> 第⼀⾏是 XML 声明。
它定义 XML 的版本 (1.0) 和所使⽤的编码. 下⼀⾏描述⽂档的根元素:<company>开始,该根元素具有2个属性“name”,"address"。
扣丁学堂_Java_17_XML
课程大纲1、什么是XML2、XML的用途3、DOM XML解析4、SAX解析XML5、JDOM解析XML6、DOM4J解析XML7、通过对象生成XML文件8、各种解析方法比较什么是1、什么是XMLp g gXML(Extensible Markup Language 可扩展标记语言),XML是一个以文本来描述数据的文档。
个XML文档示例:一个<?xml version="1.0" encoding="UTF‐8"?><person><teacher id1>id="1"><name>老郭</name><desc>一个成熟稳重有魄力的人desc>/teacher</teacher><teacher id="2"><name>威哥</name>个快乐风有内的技术男/<desc>一个快乐风趣有内涵的技术男</desc></teacher></person>2、XML的用途XML技术的用途:(1)充当显示数据(以XML充当显示层)(2)存储数据(存储层)的功能(3)以XML描述数据,并在联系服务器与系统的其余部分之间传递。
描述数据并在联系服务器与系统的其余部分之间传递从某种角度讲,是数据封装和消息传递技术XML是数据封装和消息传递技术。
3、DOM解析XMLJAVA 解析XML 通常有两种方式,DOM 和SAXDOM:Document Object Model(文档对象模型)DOM的特性:定义一组Java 接口,基于对象,与语言和平台无关将XML 文档表示为树,在内存中解析和定义组J接口基于对象与语言和平台无关将文档表示为树在内存中解析和存储XML 文档,允许随机访问文档的不同部分。
C#解析XML的特点比较和总结
C#解析XML的特点⽐较和总结XML(eXtensible Markup Language)是由万维⽹协会(W3C)推出的新⼀代数据交换的标准。
HTML是XML的先驱,XML延续了HTML的简单性的优点。
XML 不是⽤来替代HTML的, XML和HTML为不同的⽬的⽽设计: XML被设计⽤来描述数据,其焦点是数据的内容。
HTML被设计⽤来显⽰数据,其焦点是数据的外观。
HTML旨在显⽰信息,⽽XML旨在描述信息。
XML不是⼀种可执⾏的程序,它只是⼀种数据的载体,不过由于这种数据载体的格式简单易懂,加上良好的扩充性能,使得XML的⽤处⼗分⼴泛。
从三⼤框架的各种配置⽂件到Ajax中的数据交换,再到Web Service的推⾏、SOA理念的应⽤等等,都离不开XML。
XML是⼀种简单的数据格式,是100%的纯ASCII⽂本,⽽ASCII的抗破坏⼒是很强的,从⾼级的⾓度看,是⼀种⾃描述语⾔。
XML可⽤于数据交换,主要是因为XML表⽰的信息独⽴于平台,即不同的应⽤程序或者不同的操作系统。
在针对XML⽂档的应⽤编程接⼝中,⼀般有两种模型:W3C制定的DOM(Document Object Method,⽂档对象模型)和流模型。
流模型中有两种变体——“推”模型(代表为由David Megginson领导的SAX—SimpleAPI for XML⽤于XML的简单API)和“拉”模型(.NET中的流模型)。
1 “推”模型“推”模型也就是常说的SAX,SAX是⼀种靠事件驱动的模型。
它每发现⼀个节点就⽤“推”模型引发⼀个事件,⽽我们必须编写这些事件的处理程序,很⿇烦。
2 “拉”模型.NET中使⽤的是基于“拉”模型的实现⽅案。
“拉”模型在遍历⽂档时会把感兴趣的⽂档部分从读取器重拉出,不需要引发事件,允许我们以编程的⽅式访问⽂档,这⼤⼤的提⾼了灵活性,“拉”模型可以选择性的处理节点。
在.NET中,“拉”模型通过XML阅读器(XML TextReader类)来实现的。
XML解析技术
2.4 面向文档的指针式解析技术
前面提到的面向文档的流式解析效率较高,但易用性差,而对象式解析易用性强,却效率较低,这两种方式似乎处于两个极端。其效率问题主要在于两种方式都是提取解析模式,即解析时,提取一部分源文件,一般来说是一个字符串,然后在内存中进行解析构建。这种解析模式注定了需要大量的创建和销毁对象,而且还存在更新效率问题,在DOM中(SAX并不支持更新),每一次改动都需要将DOM模型重新完整的解析成XML字符串,原文件并没有被利用,即DOM并不支持增量更新。为了解决这些问题,提出了一种较新颖的指针式解析技术,即VTD-XML.
而且VTD-XML还可以高效的实现增量更新,例如,如果想在一个大型XML文档中找出一个节点元素并删除它,那么只需要找到这个元素的VTD,将这个VTD从VTD数组中删除,然后再利用所有的VTD写出到另一个二进制数组中就可以了,因为删除的VTD标明了要删除的元素的位置,所以在新写入的二进制数组中就不会出现这段元素了。用VTD写入新的二进制数组的过程实际上就是一个二进制数组的拷贝过程,其效率是非常高的[2].
SAX中的核心事件处理程序是一个实现了ContentHandler接口的类。此接口中定义了处理与XML文档本身关联的事件的方法,如 startDocument、endDocument、startElement、endElement、Characters等
SAX解析技术具有所有流式解析技术的优点和缺点,但是由于在整个解析过程中,解析器掌握着控制权直到文档结束,应用程序很难在获得所需的部分数据后停止解析过程(可以通过抛出异常的方式终止解析过程,但较为复杂,而且终止后也无法继续解析过程),因此产生了由应用程序掌握控制权的拉式解析方式。
VTD(Virtual Token Descriptor,虚拟令牌描述符)是一个64bits长度的数值类型,记录了每个元素的起始位置,长度,深度以及令牌的类型等信息,如图3所示。64bits固定长度使得可以用数组这种高效的结构来组织VTD,大幅提高性能。VTD是实现无提取解析的关键,它类似于XML文档中元素的指针,通过它可以快速定位到某个元素。
读写XML的四种方法
读写XML的四种方法XML(eXtensible Markup Language)是一种用于表示和传输数据的标记语言。
它具有良好的可读性和扩展性,被广泛应用于Web开发、数据交换和配置文件等领域。
在读写和处理XML数据时,有许多方法可供选择。
本文将介绍四种常见的读写XML的方法:DOM、SAX、JDOM、和XMLStreamReader/XMLStreamWriter。
1. DOM(Document Object Model):DOM是一种基于树形结构的解析器,它将整个XML文档加载到内存中,并将其表示为一个对象树。
在DOM中,每个XML元素都被表示为一个节点(Node),可以通过节点的属性和方法对其进行操作。
读取XML文档时,可以使用DOM解析器将其转换为一个DOM树,然后通过节点的方法访问和修改树结构。
写入XML文档时,可以通过创建和修改节点来构建DOM树,并使用DOM解析器将其保存为XML文档。
使用DOM读取XML文档的基本步骤如下:- 创建一个DocumentBuilderFactory对象。
- 根据DocumentBuilderFactory对象创建一个DocumentBuilder对象。
- 使用DocumentBuilder对象解析XML文档,并返回一个Document对象。
- 通过Document对象的方法遍历和操作XML文档的节点。
使用DOM写入XML文档的基本步骤如下:- 创建一个DocumentBuilderFactory对象。
- 根据DocumentBuilderFactory对象创建一个DocumentBuilder对象。
- 使用DocumentBuilder对象创建一个Document对象。
- 通过Document对象的方法创建和添加元素节点、属性节点等。
- 使用TransformerFactory和Transformer对象将Document对象保存为XML文档。
DOM的优点是易于使用和理解,可以方便地遍历和修改XML文档。
xml文件解析方法
xml文件解析方法XML文件解析方法引言:XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有良好的可读性和灵活性,被广泛应用于数据交换和配置文件等领域。
在处理XML文件时,解析是必不可少的环节。
本文将介绍几种常用的XML文件解析方法,包括DOM、SAX和StAX。
一、DOM解析方法DOM(文档对象模型)是一种将整个XML文件以树形结构加载到内存中的解析方法。
DOM解析器将XML文件解析为一个树状结构,通过遍历节点来获取和操作XML文件中的数据。
DOM解析方法的优点是易于理解和使用,可以随机访问XML文件中的任意节点,但缺点是占用内存较大,不适用于大型XML文件的解析。
1. 创建DOM解析器对象:使用标准的Java API,可以通过DocumentBuilderFactory类来创建DOM解析器对象。
2. 加载XML文件:通过DOM解析器对象的parse()方法加载XML文件,将其转化为一个树形结构。
3. 遍历节点:使用DOM解析器对象提供的方法,如getElementsByTagName()、getChildNodes()等,可以遍历XML文件中的各个节点,获取节点的名称、属性和文本内容等信息。
4. 获取节点数据:通过节点对象提供的方法,如getNodeName()、getTextContent()等,可以获取节点的名称和文本内容。
二、SAX解析方法SAX(简单API for XML)是一种基于事件驱动的XML解析方法。
在SAX解析过程中,解析器顺序读取XML文件,当遇到节点开始、节点结束或节点文本等事件时,会触发相应的回调方法。
相比于DOM 解析方法,SAX解析方法具有内存占用小、解析速度快的优点,但缺点是无法随机访问XML文件中的节点。
1. 创建SAX解析器对象:使用标准的Java API,可以通过SAXParserFactory类来创建SAX解析器对象。
2. 实现事件处理器:自定义一个事件处理器,实现SAX解析器提供的DefaultHandler类,并重写相应的回调方法,如startElement()、endElement()和characters()等。
xml的四种解析方法及源代码
xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J)第二种:DOM解析DOM中的核心概念就是节点。
DOM在分析XML文档时,将将组成XML文档的各个部分(元素、属性、文本、注释、处理指令等)映射为一个对象(节点)。
在内存中,这些节点形成一课文档树。
整棵树是一个节点,树中的每一个节点也是一棵树(子树),可以说,DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来存取XML文档的内容。
PS:属性节点是附属于元素的,不能被看做是元素的子节点,更不能作为一个单独的节点DOMPrinter.javaJava代码import org.w3c.dom.Document;import dNodeMap;import org.w3c.dom.Node;import .apache.xerces.internal.parsers.DOMParser;public class DOMPrinter{public static void main(String[] args){try{/** *//** 获取Document对象 */DOMParser parser = new DOMParser();parser.parse("db.xml");Document document = parser.getDocument();printNode(document);} catch (Exception e){e.printStackTrace();}}public static void printNode(Node node){short nodeType=node.getNodeType();switch(nodeType){case Node.PROCESSING_INSTRUCTION_NODE://预处理指令类型 printNodeInfo(node);break;case Node.ELEMENT_NODE://元素节点类型printNodeInfo(node);printAttribute(node);break;case Node.TEXT_NODE://文本节点类型printNodeInfo(node);break;default:break;}Node child=node.getFirstChild();while(child!=null){printNode(child);child=child.getNextSibling();}}/** *//*** 根据节点类型打印节点* @param node*/public static void printNodeInfo(Node node){if (node.getNodeType() == Node.ELEMENT_NODE){System.out.println("NodeName: " + node.getNodeName()); }else if (node.getNodeType() == Node.TEXT_NODE){String value = node.getNodeValue().trim();if (!value.equals(""))System.out.println("NodeValue: " + value);elseSystem.out.println();}else{System.out.println(node.getNodeName()+" : "+node.getNodeValu e());}}/** *//*** 打印节点属性* @param aNode 节点*/public static void printAttribute(Node aNode){NamedNodeMap attrs = aNode.getAttributes();if(attrs!=null){for (int i = 0; i < attrs.getLength(); i++){Node attNode = attrs.item(i);System.out.println("Attribute: " + attNode.getNodeName() + "=\"" + attNode.getNodeValue()+"\"");}}}DOM生成XML文档:DOMCreateExample.javaJava代码import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Element;import .apache.xml.internal.serialize.XMLSerializer;public class DOMCreateExample{public static void main(String[] args) throws ParserConfiguratio nException{//DOMImplementation domImp = DOMImplementationImpl.getDOMImple mentation();DocumentBuilderFactory builderFact = DocumentBuilderFactory.ne wInstance();DocumentBuilder builder = builderFact.newDocumentBuilder();Document doc = builder.newDocument();//Document doc = domImp.createDocument(null, null, null);Element root = doc.createElement("games");Element child1 = doc.createElement("game");child1.appendChild(doc.createTextNode("Final Fantasy VII")); child1.setAttribute("genre", "rpg");root.appendChild(child1);doc.appendChild(root);XMLSerializer serial;try{serial = new XMLSerializer(new FileOutputStream("domcreate.x ml"), null);serial.serialize(doc);} catch (FileNotFoundException e1){e1.printStackTrace();} catch (IOException e){e.printStackTrace();}}}第三种JDOM解析JDOM利用了java语言的优秀特性,极大地简化了对XML文档的处理,相比DOM 简单易用。
读取xml的五种方法
124 * @throws SAXException */
125 public void endElement(String namespaceURI, String localName,String qName) throws SAXException{
28 System.exit(1);
29 }
30 //获得根节点StuInfo
31 Element elmtStuInfo = doc.getDocumentElement();
32 //得到所有student节点
33 NodeList nlStudent = elmtStuInfo.getElementsByTagNameNS(
23 } catch (DOMException dom) {
24Message());
25 System.exit(1);
26 } catch (IOException ioe) {
27 System.err.println(ioe);
在java环境下读取xml文件的方法主要有5种:DOM、SAX、JDOM、JAXB、dom4j
最常用、最好用的dom4j
1. DOM(Document Object Model)
此 方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性能 ,对比较大的文档不适宜采用DOM方法来解析。 DOM API 直接沿袭了 XML 规范。每个结点都可以扩展的基于 Node 的接口,就多态性的观点来讲,它是优秀的,但是在 Java 语言中的应用不方便,并且可读性不强。
java xml格式返回报文解析
java xml格式返回报文解析Java中可以使用多种方式解析XML格式的返回报文,常见的方式有DOM解析、SAX解析以及基于XML绑定技术的解析。
每种方式都有不同的特点和适用场景,下面将详细介绍这三种解析方式。
1. DOM解析:DOM(Document Object Model)解析是将整个XML文档加载到内存中,构建成一个树形结构,并提供API来操作这个树。
DOM解析提供了许多API,可以通过节点遍历和搜索、属性读取和设置、节点创建和删除等方式来处理XML文档。
DOM解析适用于对XML文档进行多次读写操作,如增删改查等复杂的操作。
使用Java的DOM解析,可以通过以下几个步骤实现:1)使用DocumentBuilderFactory创建一个DocumentBuilder对象。
2)调用DocumentBuilder的parse方法,传入XML文件的输入流,将XML文档解析为一个Document对象。
3)通过Document对象可以获取XML文档的根元素,从而开始对XML文档进行遍历和操作。
DOM解析的优点是能够将整个XML文档加载到内存中,便于操作和修改。
但是对于较大的XML文件,DOM解析会消耗大量的内存空间。
2. SAX解析:SAX(Simple API for XML)解析是一种基于事件驱动的解析方式,它逐行读取XML文档并触发相应的事件,应用程序根据事件的发生来处理XML文档。
SAX解析的特点是速度快、内存消耗小,适用于对XML文档进行单次顺序读取的操作。
使用Java的SAX解析,可以通过以下几个步骤实现:1)定义一个继承自DefaultHandler的处理器类,重写相应的事件回调方法。
2)使用SAXParserFactory创建一个SAXParser对象。
3)调用SAXParser的parse方法,传入XML文件的输入流和处理器对象,开始解析XML文档。
SAX解析的优点是速度快,内存消耗小,适用于大型XML文件的解析。
dom4j解析XML文档
将dom4j-1.6.1.jar添加到系统CLASSPATH环境变量中
Dom4j常用的API 【重点掌握】
Element Branch Document
Cloneable
Node
Attribute
DocumentType
CharacterData
ProcessingInstruction
CDATA
<list> <book>疯狂XML讲义</book> <game>扫雷</game> <sport>乒乓球</sport> </list>
在获取<list…/>节点之后,如果希望获取它包含的3个子节点的数 节点之后,如果希望获取它包含的 个子节点的数 在获取 节点之后 据,需要使用如下代码
//获取list元素下的所有子元素 NodeList itemList=list.getChildNodes(); //遍历每个子元素 for(int I=0;I<itemList.getLength();I++){ System.out.println(itemList.item(j).getTextContent().trim()); }
Vistor接口的方法
visit(Attribute node) visit(CDATA node)
简单说明
当Visitor对象访问属性节点时将回调该方法 当Visitor对象访问CDATA片段时将回调该方法 当Visitor对象访问注释节点时将回调该方法 当Visitor对象访问文档根节点时将回调该方法 当Visitor对象访问DTD内容将回调该方法 当Visitor对象访问元素节点将回调该方法 当Visitor对象访问Entity节点将回调该方法 当Visitor对象访问命名空间时回调该方法 当Visitor对象访问处理指令时回调该方法 当Visitor对象访问文档内容时将回调该方法
Java解析XML的四种方法
Java解析XML的四种方法概序XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。
XML文件解析方法XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。
基本的解析方式有两种,一种叫SAX,另一种叫DOM。
SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。
假设我们XML的内容和结构如下:<?xml version="1.0" encoding="UTF-8"?><employees><employee><name>ddviplinux</name><sex>m</sex><age>30</age></employee></employees>本文实现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 接口来操作这个树结构。
java读取XML文件内容的四种方法
Java parse XML methods(4)关键字: xml1. 介绍1>DOM(JAXP Crimson解析器)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。
DOM是以层次结构组织的节点或信息片断的集合。
这个层次结构允许开发人员在树中寻找特定信息。
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。
由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
DOM 以及广义的基于树的处理具有几个优点。
首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。
DOM使用起来也要简单得多。
2>SAXSAX处理的优点非常类似于流媒体的优点。
分析能够立即开始,而不是等待所有的数据被处理。
而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于大型文档来说是个巨大的优点。
事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
一般来说,SAX还比它的替代者DOM快许多。
选择DOM还是选择SAX?对于需要自己编写代码来处理XML文档的开发人员来说,选择DOM还是SAX解析模型是一个非常重要的设计决策。
DOM采用建立树形结构的方式访问XML文档,而SAX 采用的事件模型。
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。
用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用 navigation APIs访问所需的树节点来完成任务。
可以很容易的添加和修改树中的元素。
然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。
由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。
XML的四种解析器
xml的四种解析器1)dom(jaxp crimson解析器)dom是用与平台和语言无关的方式表示xml文档的官方w3c标准。
dom是以层次结构组织的节点或信息片断的集合。
这个层次结构允许开发人员在树中寻找特定信息。
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。
由于它是基于信息层次的,因而dom被认为是基于树或基于对象的。
dom 以及广义的基于树的处理具有几个优点。
首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,而不是像sax那样是一次性的处理。
dom使用起来也要简单得多。
2)saxsax处理的优点非常类似于流媒体的优点。
分析能够立即开始,而不是等待所有的数据被处理。
而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于大型文档来说是个巨大的优点。
事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
一般来说,sax还比它的替代者dom快许多。
选择dom还是选择sax?对于需要自己编写代码来处理xml文档的开发人员来说,选择dom还是sax解析模型是一个非常重要的设计决策。
dom采用建立树形结构的方式访问xml文档,而sax采用的事件模型。
dom解析器把xml文档转化为一个包含其内容的树,并可以对树进行遍历。
用dom解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation apis访问所需的树节点来完成任务。
可以很容易的添加和修改树中的元素。
然而由于使用dom解析器的时候需要处理整个xml文档,所以对性能和内存的要求比较高,尤其是遇到很大的xml文件的时候。
由于它的遍历能力,dom解析器常用于xml文档需要频繁的改变的服务中。
sax解析器采用了基于事件的模型,它在解析 xml文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。
解析xml格式字符串标签数据的方法
解析xml格式字符串标签数据的方法XML格式字符串是一种常用的数据格式,它可以表示复杂的数据结构。
在处理XML格式字符串时,我们需要解析其中的标签数据,才能获取其中的内容。
下面是几种解析XML格式字符串标签数据的方法: 1. DOM解析:DOM是Document Object Model的缩写,它将XML 数据组织成一个树形结构,可以通过操作节点对象来访问和修改数据。
使用DOM解析XML格式字符串需要加载完整的XML文档到内存中,因此适合处理较小的XML数据,但对于大型XML数据,DOM解析可能会导致性能问题。
2. SAX解析:SAX是Simple API for XML的缩写,它是一种基于事件驱动的解析方式,可以在读取XML数据时逐个处理数据。
SAX解析对内存的要求非常低,适合处理大型XML数据,但由于它是基于事件驱动的,因此需要编写复杂的回调函数来处理数据。
3. XPath解析:XPath是一种查询语言,可以通过路径表达式来访问XML数据中的元素、属性等。
使用XPath解析XML格式字符串时,可以通过XPath表达式来获取特定的元素或属性的值,非常方便。
不过,XPath解析需要加载完整的XML文档到内存中,对于大型XML数据仍然存在性能问题。
4. XML解析器:除了DOM、SAX和XPath解析之外,还有一些XML 解析器可以用来解析XML格式字符串。
例如,Python中的ElementTree 模块提供了一种简单的解析方式,可以快速地访问和修改XML数据。
总之,在解析XML格式字符串时,需要根据实际的需求选择合适的解析方式。
如果对内存要求比较高,可以使用SAX解析;如果需要快速访问和修改XML数据,可以考虑使用XPath解析或XML解析器。
java解析xml详解及示例
java解析xml详解及示例java 解析xml的几种方法第一种:DOMDOM的全称是Document Object Model,也即文档对象模型。
在应用程序中,基于DOM 的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。
通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档结构形成了一棵节点树。
无论XML文档中所描述的是什么类型的信息,即便是制表数据、项目列表或一个文档,利用DOM所生成的模型都是节点树的形式。
也就是说,DOM强制使用树模型来访问XML文档中的信息。
由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的。
DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。
然而,由于DOM 分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。
而且,对于结构复杂的树的遍历也是一项耗时的操作。
所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。
不过,由于DOM分析器所采用的树结构的思想与XML 文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的。
Java代码import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;public class DomT est1{public static void main(String[] args) throws Exception{// step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器)DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();// System.out.println("class name: " + dbf.getClass().getName());// step 2:获得具体的dom解析器DocumentBuilder db = dbf.newDocumentBuilder();// System.out.println("class name: " + db.getClass().getName());// step3: 解析一个xml文档,获得Document对象(根结点)Document document = db.parse(new File("candidate.xml"));NodeList list = document.getElementsByTagName("PERSON");for(int i = 0; i < list.getLength(); i++){Element element = (Element)list.item(i);String content =element.getElementsByTagName("NAME").item(0).getFirstC hild().getNodeValue();System.out.println("name:" + content);content =element.getElementsByTagName("ADDRESS").item(0).getFir stChild().getNodeValue(); System.out.println("address:" + content);content =element.getElementsByTagName("TEL").item(0).getFirstChil d().getNodeValue();System.out.println("tel:" + content);content =element.getElementsByTagName("FAX").item(0).getFirstChil d().getNodeValue();System.out.println("fax:" + content);content =element.getElementsByTagName("EMAIL").item(0).getFirstC hild().getNodeValue();System.out.println("email:" + content);System.out.println("--------------------------------------");}}}Java代码import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Attr;import /doc/723478280.html,ment;import org.w3c.dom.Document;import org.w3c.dom.Element;import/doc/723478280.html,dNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;/*** 使用递归解析给定的任意一个xml文档并且将其内容输出到命令行上* @author*/public class DomT est3{public static void main(String[] args) throws Exception{DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.parse(new File("student.xml"));//获得根元素结点Element root = doc.getDocumentElement();parseElement(root);}private static void parseElement(Element element){String tagName = element.getNodeName();NodeList children = element.getChildNodes();System.out.print("<" + tagName);//element元素的所有属性所构成的NamedNodeMap对象,需要对其进行判断 NamedNodeMap map = element.getAttributes();//如果该元素存在属性if(null != map){{//获得该元素的每一个属性Attr attr = (Attr)map.item(i);String attrName = attr.getName();String attrValue = attr.getValue();System.out.print(" " + attrName + "=\"" + attrValue + "\""); } }System.out.print(">");for(int i = 0; i < children.getLength(); i++){Node node = children.item(i);//获得结点的类型short nodeType = node.getNodeType();if(nodeType == Node.ELEMENT_NODE){//是元素,继续递归parseElement((Element)node);}else if(nodeType == Node.TEXT_NODE){//递归出口System.out.print(node.getNodeValue());}else if(nodeType == /doc/723478280.html,MENT_NODE) {System.out.print("System.out.print(data);System.out.print("-->");}}System.out.print("");}}第二种 sax:SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。
DOM和sax的区别
与 DOM比较而言,SAX是一种轻量型的方法。我们知道,在处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成DOM树上的每个Node对象。当文档比较小的时候,这不会造成什么问题,但是一旦文档大起来,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件很不划算的事(比如在applet中)。这时候,一个较好的替代解决方法就是SAX。
在XMLReader接受XML文档,在读入XML文档的过程中就进行解析,也就是说读入文档的过程和解析的过程是同时进行的,这和DOM区别很大。解析开始之前,需要向XMLReader注册一个ContentHandler,也就是相当于一个事件监听器,在 ContentHandler中定义了很多方法,比如startDocument(),它定制了当在解析过程中,遇到文档开始时应该处理的事情。当 XMLReader读到合适的内容,就会抛出相应的事件,并把这个事件的处理权代理给ContentHandler,调用其相应的方法进行响应。
SAX 在概念上与DOM完全不同。首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。(如果你对Java新的代理事件模型比较清楚的话,就会很容易理解这种机制了)
解析XML文档-SAX和DOM
JAXP(Java API for XML Processing)为打包器提供了两种不同的处理XML数据的机制,第一种是XML的简单API(Simple API for XML,即SAX),第二种是文档对象模型(Document Object Model,即DOM)。
SAX解析核心思路:在SAX模型中,XML文档作为一系列的事件提供给应用程序,每个事件表示XML文档的一种转换。
SAX解析优缺点:SAX解析的利用事件进行处理可以处理很大的文档,并且不必立即将整个文档读入内存。
然而使用XML文档的片段可能会变得复杂,因为开发人员必须跟踪给定片段的所有事件。
SAX是个广泛使用的标准,但不受任何行业团体控制。
现在SAX得到开源项目的支持。
SAX事件模型:SAX事件包括:文档事件(通知程序一个XML文档的开始和结束)、元素事件(通知程序每个元素的开始和结束)、字符事件(通知程序在元素之间找到的任何字符数据,包括文本、实体和CDATA段),还有不常见的事件:命名空间、实体和实体声明、可忽略的空白、处理指令。
SAX事件处理器:1.ContentHandlerContentHanler是任何SAX解析器的核心接口。
它定义了在SAX API中最常用的10个回调函数。
2.DefaultHandler具体实现了ContentHandler接口,允许集中于常用的事件。
可以使用自己的子类扩展(extends)DefaultHandler类。
基本的SAX回调函数:1.文档回调public void startDocument() throws SAXException;SAX通过调用该函数来开始每次解析。
public void endDocument() throws SAXException;SAX通过调用该函数来表示解析的结束。
2.元素回调public void startElement(String uri, String localName, String qName, Attributes atts) throwsSAXException;qName是元素的名称;元素的属性可以依据名称简单地进行引用。
Dom4J、JDOM、DOM、SAX和Pull技术解析XML文件
解析XML文件的五种技术1.1SAX技术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解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
1.1.1 SAX语法简介SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。
SAX 解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1)DOM(JAXP Crimson解析器)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。
DOM 是以层次结构组织的节点或信息片断的集合。
这个层次结构允许开发人员在树中寻找特定信息。
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。
由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
DOM以及广义的基于树的处理具有几个优点。
首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。
DOM使用起来也要简单得多。
2)SAXSAX处理的优点非常类似于流媒体的优点。
分析能够立即开始,而不是等待所有的数据被处理。
而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于大型文档来说是个巨大的优点。
事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
一般来说,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 /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 /虽然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.<?xml version="1.0"encoding="utf-8"?>2.<Result>3.<VALUE>4.<NO DATE="2005">A1</NO>5.<ADDR>GZ</ADDR>6.</VALUE>7.<VALUE>8.<NO DATE="2004">A2</NO>9.<ADDR>XG</ADDR>10.</VALUE>11.</Result>1)DOMJava代码1.import java.io.*;2.import java.util.*;3.import org.w3c.dom.*;4.import javax.xml.parsers.*;5.6.public class MyXMLReader{7.public static void main(String arge[]){8.9.long lasting =System.currentTimeMillis();10.try{11.File f=new File("data_10k.xml");12.DocumentBuilderFactory factory=DocumentBuilderFactory.newIn stance();13.DocumentBuilder builder=factory.newDocumentBuilder();14.Document doc = builder.parse(f);15.NodeList nl = doc.getElementsByTagName("VALUE");16.for (int i=0;i<nl.getLength();i++){17.System.out.print("车牌号码:" + doc.getElementsByTagName("NO").item(i).getFirstChild().g etNodeValue());18.System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild() .getNodeValue());19.}20.}catch(Exception e){21. e.printStackTrace();22.}2)SAXJava代码1.import org.xml.sax.*;2.import org.xml.sax.helpers.*;3.import javax.xml.parsers.*;4.5.public class MyXMLReader extends DefaultHandler {6.7.java.util.Stack tags = new java.util.Stack();8.public MyXMLReader() {9.super();10. }11.12.public static void main(String args[]) {13.long lasting = System.currentTimeMillis();14.try {15.SAXParserFactory sf = SAXParserFactory.newInstance();16.SAXParser sp = sf.newSAXParser();17.MyXMLReader reader = new MyXMLReader();18.sp.parse(new InputSource("data_10k.xml"), reader);19.} catch (Exception e) {20. e.printStackTrace();21.}22.23.System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");}24.public void characters(char ch[], int start, int length) throws SAXEx ception {25.String tag = (String) tags.peek();26.if (tag.equals("NO")) {27.System.out.print("车牌号码:" + new String(ch, start, length));28. }29. if (tag.equals("ADDR")) {30.System.out.println("地址:" + new String(ch, start, length));31. }32. }33.34.public void startElement(String uri,String localName,String qNam e,Attributes attrs) {35.tags.push(qName);}36.}3)JDOMJava代码1.import java.io.*;2.import java.util.*;3.import org.jdom.*;4.import org.jdom.input.*;5.6.public class MyXMLReader {7.8.public static void main(String arge[]) {9.long lasting = System.currentTimeMillis();10.try {11.SAXBuilder builder = new SAXBuilder();12.Document doc = builder.build(new File("data_10k.xml"));13.Element foo = doc.getRootElement();14.List allChildren = foo.getChildren();15.for(int i=0;i<allChildren.size();i++) {16.System.out.print("车牌号码:" + ((Element)allChildren.get(i)).getChild("NO").getText());17.System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());18.}19.} catch (Exception e) {20. e.printStackTrace();21.}22.23.}4)DOM4JJava代码1.import java.io.*;2.import java.util.*;3.import org.dom4j.*;4.import org.dom4j.io.*;5.6.public class MyXMLReader {7.8.public static void main(String arge[]) {9.long lasting = System.currentTimeMillis();10.try {11.File f = new File("data_10k.xml");12.SAXReader reader = new SAXReader();13.Document doc = reader.read(f);14.Element root = doc.getRootElement();15.Element foo;16.for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {17.foo = (Element) i.next();18.System.out.print("车牌号码:" + foo.elementText("NO"));19.System.out.println("车主地址:" + foo.elementText("ADDR"));20.}21.} catch (Exception e) {22. e.printStackTrace();23. }24.}。