xml解析方式区别

合集下载

XML的四种解析器原理及性能比较

XML的四种解析器原理及性能比较

XML的四种解析器原理及性能比较XML是一种标记语言,用于描述和传输结构化的数据。

解析器是将XML文档解析成计算机能够理解的数据结构的工具。

XML解析器有四种常见的类型,分别是:DOM解析器、SAX解析器、StAX解析器和Pull解析器。

以下将对这四种解析器的原理和性能进行比较。

1. DOM解析器(Document Object Model):DOM解析器将整个XML文档加载到内存中,生成一棵树形结构的文档对象模型(DOM树)。

通过DOM树,可以对XML文档进行遍历、读取和修改。

DOM解析器的优点是易于使用和理解,缺点是占用较大的内存空间,对大型XML文档解析速度慢。

2. SAX解析器(Simple API for XML):SAX解析器是一种事件驱动的解析器,它通过逐行读取XML文档并触发事件来解析XML。

当解析器遇到元素时,会产生相应的事件,应用程序可以注册事件处理器来执行相关操作。

SAX解析器的优点是速度快,占用少量内存,适用于大型XML文档。

缺点是编码相对复杂,需要开发者自行处理解析事件。

3. StAX解析器(Streaming API for XML):StAX解析器是一种基于迭代器的解析器,提供了流式的XML处理方式。

它允许应用程序以推(pull)的方式逐行解析XML文档。

StAX解析器提供了两个核心接口:XMLStreamReader和XMLStreamWriter,分别用于读取和写入XML文档。

StAX解析器的优点是速度快,占用较少内存,适用于大型XML文档。

缺点是相对复杂,需要开发者主动控制解析过程。

4. Pull解析器:Pull解析器也是一种基于迭代器的解析器,类似于StAX解析器。

它通过迭代器(PullIterator)的方式逐行读取和处理XML文档。

相比StAX解析器,Pull解析器更加轻量级,占用更少的内存。

然而,Pull解析器的功能相对有限,仅提供了基本的解析功能。

在性能方面,DOM解析器通常需要将整个XML文档加载到内存中,适用于小型XML文档,而对于大型XML文档,DOM解析器的性能较低。

单片机xml解析

单片机xml解析

单片机xml解析“单片机XML解析”是指使用单片机(通常指微控制器或微处理器)来解析XML格式的数据。

XML(可扩展标记语言)是一种用于存储和传输数据的格式,它使用标记来描述数据的内容和结构。

在嵌入式系统和物联网设备中,解析XML数据可以用于读取配置、通讯协议或者应用程序状态等信息。

单片机XML解析的方法有多种,常见的有:1.库函数解析:许多单片机厂商或第三方库提供了用于解析XML的函数或工具。

这些库通常封装了底层硬件操作,使得开发者可以更方便地读取XML 数据并将其转换为可以在单片机上处理的形式。

2.字符串处理:对于一些资源有限的单片机,可以使用字符串处理函数逐字符读取XML数据,并手动解析其结构和内容。

这种方法比较基础,但灵活度较高。

3.自定义解析器:根据XML的结构和需求,可以编写自定义的解析函数或程序。

这种方法可以提供更好的性能和定制性,但需要投入更多的开发时间和资源。

4.网络协议库:许多单片机支持网络通讯,而许多网络协议(如HTTP)使用XML作为数据交换格式。

因此,通过使用网络协议库,单片机可以直接从网络上获取XML数据并进行解析。

5.中间件/代理:对于更复杂的应用,可以使用一个中间件或代理来接收和处理XML数据,然后再将处理后的数据发送给单片机。

这种方法可以减轻单片机的处理负担,但会增加系统的复杂性和延迟。

总结来说,“单片机XML解析”是指使用单片机来读取、解析和处理XML格式的数据。

这通常涉及到硬件操作、字符串处理、网络通讯等方面的技术。

通过解析XML数据,单片机可以实现更高级的功能,如远程配置、动态数据交换等。

Android XML 三种解析

Android XML 三种解析

在Android程序中,Xml解析与Java中几乎相同,最常用的有SAX,DOM,PULL 三种解析方式。

Android中内置了pull解析方式。

这也是android推荐的解析方式。

下面我们就看下这三种的用法,与不同1)SAX:(Simple API for XML)这种解析方式基于事件的模型。

通俗的讲就是XML文件在加载的过程中,加载到不同节点会相应触发不同方法来处理。

它属于一次加载。

它可以处理任意大小的XML文件,它对内存的要求非常低,因为SAX采用的是读取文件的方式,也就是当它是文本文件在读,读完就完了,什么信息都没有保存。

当然它也有其缺点,解析过程中无法中断,只能读取XML文件而不能修改,编码上也相对复杂与难于理解。

它的常用方法:void startDocument()//文档开始时触发该方法void endDocument()//文档结束时void startElement(String uri, String localName, String qName, Attributes atts)//元素开始void endElement(String uri, String localName, String qName)//元素结束void characters(char[ ] ch, int start, int length)//文本节点创建SAX解析器:(1)用系统默认值来创建一个XMLReader(解析器):XMLReader reader = XMLReaderFactory.createXMLReader();(2)从给定的类名称来创建一个XMLReader :XMLReader reader =XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");(3)使用javax.xml.parsers包中的SAXParserFactory类和SAXParser类创建:SAXParserFactory spFactory = SAXParserFactory.newInstance();SAXParser sParser = spFactory.newSAXParser();2)DOM:(Document Object Model)文档对象模型,它是基于对象的,又或者基于树的。

解析Xml文件的三种方式

解析Xml文件的三种方式

解析Xml⽂件的三种⽅式1、Sax解析(simple api for xml) 使⽤流式处理的⽅式,它并不记录所读内容的相关信息。

它是⼀种以事件为驱动的XML API,解析速度快,占⽤内存少。

使⽤回调函数来实现。

1class MyDefaultHander extends DefaultHandler{2private List<Student> list;3private Student student;45 @Override6public void startDocument() throws SAXException {7super.startDocument();8 list=new ArrayList<>();9 }1011 @Override12public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {13super.startElement(uri, localName, qName, attributes);14if(qName.equals("student")){15 student=new Student();1617 }18 preTag=qName;19 }2021 @Override22public void endElement(String uri, String localName, String qName) throws SAXException {23if(qName.equals("student")){24 list.add(student);25 }26 preTag=null;27 }2829 @Override30public void characters(char[] ch, int start, int length) throws SAXException {31if(preTag!=null){32if(preTag.equals("id")){33 student.setId(Integer.parseInt(new String(ch,start,length)));34 }else if(preTag.equals("name")){35 student.setName(new String(ch,start,length));36 }else if(preTag.equals("age")){37 student.setAge(Integer.parseInt(new String(ch,start,length)));38 }39 }40 }41public List<Student> getStudents(){42return list;43 }44 }45public List<Student> sax_parser(){46 List<Student> list=null;47try {48 SAXParser parser= SAXParserFactory.newInstance().newSAXParser();49 InputStream is= getAssets().open("student.xml");50 MyDefaultHander hander=new MyDefaultHander();51 parser.parse(is,hander);52 list= hander.getStudents();53 } catch (ParserConfigurationException e) {54 e.printStackTrace();55 } catch (SAXException e) {56 e.printStackTrace();57 } catch (IOException e) {58 e.printStackTrace();59 }60return list;61 }2、Dom解析 DOM(Document Object Model) 是⼀种⽤于XML⽂档的对象模型,可⽤于直接访问XML⽂档的各个部分。

AndroidXML数据的三种解析方式

AndroidXML数据的三种解析方式

AndroidXML数据的三种解析⽅式本篇⽂章包含以下内容:XML数据的Dom解析XML数据的Sax解析XML数据的Pull解析Activity中使⽤三种解析Sax解析与Pull解析区别三种解析⽅式的步骤:1.在Assets⽂件夹中模拟创建XML数据2.创建对应XML的Bean对象3.开始解析XML数据的Dom解析DOM解析XML⽂件时,会将XML⽂件的所有内容读取到内存中(内存的消耗⽐较⼤),然后允许您使⽤DOM API遍历XML 树、检索所需的数据⼀、在Assets⽂件夹中模拟创建XML⽂件<students><student><name sex="man">⼩明</name><nickName>明明</nickName></student><student><name sex="woman">⼩红</name><nickName>红红</nickName></student><student><name sex="man">⼩亮</name><nickName>亮亮</nickName></student></students>⼆、创建对应XML的Bean对象public class Student {private String name;private String sex;private String nickName;public String getName() {return name;}public void setName(String name) { = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getNickName() {return nickName;}public void setNickName(String nickName) {this.nickName = nickName;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", sex='" + sex + '\'' +", nickName='" + nickName + '\'' +'}';}}三、Dom解析public List<Student> dom2xml(InputStream is) throws Exception {//⼀系列的初始化List<Student> list = new ArrayList<>();DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();//获得Document对象Document document = builder.parse(is);//获得student的ListNodeList studentList = document.getElementsByTagName("student");//遍历student标签for (int i = 0; i < studentList.getLength(); i++) {//获得student标签Node node_student = studentList.item(i);//获得student标签⾥⾯的标签NodeList childNodes = node_student.getChildNodes();//新建student对象Student student = new Student();//遍历student标签⾥⾯的标签for (int j = 0; j < childNodes.getLength(); j++) {//获得name和nickName标签Node childNode = childNodes.item(j);//判断是name还是nickNameif ("name".equals(childNode.getNodeName())) {String name = childNode.getTextContent();student.setName(name);//获取name的属性NamedNodeMap nnm = childNode.getAttributes();//获取sex属性,由于只有⼀个属性,所以取0Node n = nnm.item(0);student.setSex(n.getTextContent());} else if ("nickName".equals(childNode.getNodeName())) {String nickName = childNode.getTextContent();student.setNickName(nickName);}}//加到List中list.add(student);}return list;}XML数据的Sax解析SAX是⼀个解析速度快并且占⽤内存少的xml解析器,SAX解析XML⽂件采⽤的是事件驱动,它并不需要解析完整个⽂档,⽽是按内容顺序解析⽂档的过程由于前⾯⼀和⼆的步骤是⼀样的,这⾥就省略了三、Sax解析public List<Student> sax2xml(InputStream is) throws Exception {SAXParserFactory spf = SAXParserFactory.newInstance();//初始化Sax解析器SAXParser sp = spf.newSAXParser();//新建解析处理器MyHandler handler = new MyHandler();//将解析交给处理器sp.parse(is, handler);//返回Listreturn handler.getList();}public class MyHandler extends DefaultHandler {private List<Student> list;private Student student;//⽤于存储读取的临时变量private String tempString;/*** 解析到⽂档开始调⽤,⼀般做初始化操作** @throws SAXException*/@Overridepublic void startDocument() throws SAXException {list = new ArrayList<>();super.startDocument();}/*** 解析到⽂档末尾调⽤,⼀般做回收操作** @throws SAXException*/@Overridepublic void endDocument() throws SAXException {super.endDocument();}/*** 每读到⼀个元素就调⽤该⽅法** @param uri* @param localName* @param qName* @param attributes* @throws SAXException*/@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if ("student".equals(qName)) {//读到student标签student = new Student();} else if ("name".equals(qName)) {//获取name⾥⾯的属性String sex = attributes.getValue("sex");student.setSex(sex);}super.startElement(uri, localName, qName, attributes);}/*** 读到元素的结尾调⽤** @param uri* @param localName* @param qName* @throws SAXException*/@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {if ("student".equals(qName)) {list.add(student);}if ("name".equals(qName)) {student.setName(tempString);} else if ("nickName".equals(qName)) {student.setNickName(qName);}super.endElement(uri, localName, qName);}/*** 读到属性内容调⽤** @param ch* @param start* @param length* @throws SAXException*/@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {tempString = new String(ch, start, length);super.characters(ch, start, length);}/*** 获取该List** @return*/public List<Student> getList() {return list;}}XML数据的Pull解析Pull解析器的运⾏⽅式与 SAX 解析器相似。

XML的四种解析器原理及性能比较

XML的四种解析器原理及性能比较

XML的四种解析器原理及性能比较1.DOM解析器:DOM解析器将整个XML文档加载到内存中,形成一个树形结构(DOM 树),并提供了对该树进行遍历、查询和修改的操作。

DOM解析器适合于需要多次访问XML元素且需要对XML进行频繁修改的场景。

DOM解析器的原理是将整个XML文档转换为一个树形结构,其中每个节点代表一个XML元素。

由于需要将整个文档加载到内存中,所以对于大型的XML文档,DOM解析器的内存消耗会比较大。

2.SAX解析器:SAX解析器的原理是逐个读取XML文档的节点,并在遇到事件时通过回调函数进行处理。

由于SAX解析器在解析过程中不需要将整个文档加载到内存,所以对于大型的XML文档,它的内存消耗相对较小。

3.StAX解析器:StAX解析器是一种基于迭代器的流式解析器。

它提供了许多类似于迭代器的方法,可以用于逐个处理XML文档中的节点。

StAX解析器既支持事件驱动的处理方式,也支持基于指针的处理方式。

StAX解析器的原理是通过指针方式遍历XML文档,并提供了一系列的API来操作当前指针所指向的节点。

由于StAX解析器在解析过程中只需要加载部分文档内容到内存,所以其内存消耗也比较小。

4. XPath解析器:XPath解析器是一种通过路径表达式来定位和选择XML文档中的节点的解析器。

XPath解析器可以将一个XPath表达式应用到XML文档上,然后返回所匹配的节点集合或属性的值。

XPath解析器的原理是将XPath表达式与XML文档进行匹配,使用查询语言来过滤和选择XML文档中的节点集合。

由于XPath解析器只需加载部分文档内容,所以其内存消耗也较小。

性能比较方面,选择解析器应根据实际需求和XML文档的特点来决定:- 对于小型XML文档,在DOM解析器中使用XPath表达式进行查询较为方便,且性能较好;-对于大型XML文档,SAX解析器和StAX解析器是更好的选择,因为它们在解析过程中不需要加载整个文档到内存中,所以能够节省内存消耗;-如果需要对XML文档进行多次访问和修改,DOM解析器是较好的选择,因为它可以将文档加载到内存中形成DOM树,可以方便地进行多次操作。

xml 格式 解析

xml 格式 解析

xml 格式解析XML格式解析是一种常见的数据解析方法,它可以将XML格式的数据转换为可供程序使用的数据结构。

XML即可扩展标记语言(eXtensible Markup Language),它被广泛应用于数据交换和存储。

下面将介绍XML格式解析的原理和常用的解析方法。

XML格式解析的原理是通过读取XML文件并识别其中的标签、属性和文本内容,将其转换为内存中的数据结构,以便程序进行进一步处理。

XML文件由起始标签、结束标签、属性和文本内容组成。

解析器会根据这些组成部分对XML文档进行解析。

常用的XML格式解析方法有两种:DOM解析和SAX解析。

DOM(文档对象模型)解析是一种将整个XML文档加载到内存中,并构建一个XML树结构的解析方法。

它可以方便地对XML文档进行增删改查操作。

DOM解析器会先将整个XML文档加载到内存中,然后构建一个树状结构,通过遍历树状结构来访问和操作XML文档的节点。

SAX(简单 API for XML)解析是一种基于事件驱动的解析方法。

它边读取XML文档边解析,并在读取到XML文档的不同部分时触发相应的事件。

相比DOM解析,SAX解析更加高效,特别适用于大型XML文件的解析。

SAX解析器会逐行读取XML文档,当遇到起始标签、结束标签或文本内容时触发相应的事件,并通过事件处理程序来处理这些事件。

选择使用DOM解析还是SAX解析取决于具体的需求。

如果需要对XML文档进行多次操作或查询,DOM解析更方便。

但是,如果处理大型XML文件或只需一次性读取XML数据,SAX解析更高效。

总之,XML格式解析是处理XML数据的重要技术。

通过DOM解析和SAX 解析,我们可以将XML格式的数据转换为程序可以处理的数据结构,实现数据的读取、分析和操作。

XML解析的四种方法建议使用demo4j解析测试可以用

XML解析的四种方法建议使用demo4j解析测试可以用

XML解析的四种⽅法建议使⽤demo4j解析测试可以⽤4、DOM4J解析 特征: 1、JDOM的⼀种智能分⽀,它合并了许多超出基本XML⽂档表⽰的功能。

2、它使⽤接⼝和抽象基本类⽅法。

3、具有性能优异、灵活性好、功能强⼤和极端易⽤的特点。

4、是⼀个开放源码的⽂件 以下是解析代码:public class DOM4JTest {private static ArrayList<Book> bookList = new ArrayList<Book>();/*** @param args*/public static void main(String[] args) {// 解析books.xml⽂件// 创建SAXReader的对象readerSAXReader reader = new SAXReader();try {// 通过reader对象的read⽅法加载books.xml⽂件,获取docuemnt对象。

Document document = reader.read(new File("src/res/books.xml"));// 通过document对象获取根节点bookstoreElement bookStore = document.getRootElement();// 通过element对象的elementIterator⽅法获取迭代器Iterator it = bookStore.elementIterator();// 遍历迭代器,获取根节点中的信息(书籍)while (it.hasNext()) {System.out.println("=====开始遍历某⼀本书=====");Element book = (Element) it.next();// 获取book的属性名以及属性值List<Attribute> bookAttrs = book.attributes();for (Attribute attr : bookAttrs) {System.out.println("属性名:" + attr.getName() + "--属性值:"+ attr.getValue());}Iterator itt = book.elementIterator();while (itt.hasNext()) {Element bookChild = (Element) itt.next();System.out.println("节点名:" + bookChild.getName() + "--节点值:" + bookChild.getStringValue());}System.out.println("=====结束遍历某⼀本书=====");}} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}。

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()等。

Android中的三种XML解析方式

Android中的三种XML解析方式

Android中的三种XML解析方式在Android中提供了三种解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推荐的Pull解析方式.下面就对三种解析方式一一详细阐述。

假设要要解析person.xml文档<?xml version="1.0" encoding="UTF-8"?><persons><person id="1"><name>zhangsan</name><age>21</age></person><person id="2"><name>lisi</name><age>22</age></person><person id="3"><name>wangwu</name><age>222</age></person></persons>首先介绍SAX解析,SAX是事件驱动型XML解析的一个标准接口不会改变SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

下面结合代码分析public class SAXPersonService {public List<Person> getPersons (InputStream instream) throws Exception{ SAXParserFactory factory = SAXParserFactory.newInstance();//创建SAX解析工厂SAXParser paser = factory.newSAXParser();//创建SAX解析器PersonPaser personPaser=new PersonPaser();//创建事件处理程序paser.parse(instream,personPaser);//开始解析instream.close();//关闭输入流return personPaser.getPersons();//返回解析后的内容}public final class PersonPaser extends DefaultHandler{//创建事件处理程序,也就是编写ContentHandler的实现类,一般继承自DefaultHandler类public List<Person> getPersons() {return persons;}private List<Person> persons=null;private String tagName=null;private Person person=null;{//遇到文档开始标记的时候创建person集合public void startDocument() throws SAXException persons=new ArrayList<Person>();}//遇到元素节点开始时候的处理方法public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {tagName = localName;//如果遇到<person>标记,则创建一个personif("person".equals(tagName)){person = new Person();person.setId(new Integer(attributes.getValue(0)));//取出标记内的属性}}//遇到文本节点时的操作public void characters(char[] ch, int start, int length)throws SAXException {if(tagName!=null){//文本节点必须前面要有元素节点开始标记String data = new String(ch,start,length);//取出文本节点的值if("name".equals(tagName)){//如果前面的元素节点开始标记是nameperson.setName(data);//则将文本节点的值赋值给person的Name}else if("age".equals(tagName)){//如果前面元素节点开始标记是ageperson.setAge(new Short(data));//则将本节点的值赋值给person的Age}}}//遇到元素节点结束时候的操作public void endElement(String uri, String localName, String qName)throws SAXException {if("person".equals(localName)){//如果遇到</person>标记persons.add(person);//则将创建完成的person加入到集合中去person=null;//置空下一个person}tagName=null;//置空已有标记,因为要解析下一个节点了}}至此,SAX解析完毕!下面介绍DOM解析,DOM,即对象文档模型,它是将整个XML文档载入内存(所以效率较低,不推荐使用),每一个节点当做一个对象,结合代码分析public class DomPersonService {public List<Person> getPersons (InputStream instream) throws Exception{List<Person> persons = new ArrayList<Person>();DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//创建DOM解析工厂DocumentBuilder dombuild = factory.newDocumentBuilder();//创建DON解析器Document dom = dombuild.parse(instream);//开始解析XML文档并且得到整个文档的对象模型Element root= dom.getDocumentElement();//得到根节点<persons>NodeList personList = root.getElementsByTagName_r("person");//得到根节点下所有标签为<person>的子节点for(int i = 0;i<personList.getLength();i++){//遍历person节点Person person = new Person();//首先创建一个PersonElement personElement = (Element) personList.item(i);//得到本次Person元素节点person.setId(new Integer(personElement.getAttribute("id")));//得到Person节点中的ID NodeList personChilds = personElement.getChildNodes();//得到Person节点下的所有子节点for(int j=0;j<personChilds.getLength();j++){//遍历person节点下的所有子节点if(personChilds.item(j).getNodeType()==Node.ELEMENT_NODE){//如果是元素节点的话Element childElement = (Element) personChilds.item(j); //得到该元素节点if("name".equals(childElement.getNodeName())){//如果该元素节点是name节点person.setName(childElement.getFirstChild().getNodeValue());//得到name节点下的第一个文本子节点的值}else if("age".equals(childElement.getNodeName())){//如果该元素节点是age节点、person.setAge(new Short(childElement.getFirstChild().getNodeValue()));//得到age节点下的第一个文本字节点的值}}}persons.add(person);//遍历完person下的所有子节点后将person元素加入到集合中去}return persons;}至此,DOM解析方式结束!下面介绍Pull解析public class PulPersonService {public List<Person> getPersons(InputStream instream) throws Exception {List<Person> persons = null;Person person = null;XmlPullParser parser = Xml.newPullParser();//得到Pull解析器parser.setInput(instream, "UTF-8");//设置下输入流的编码int eventType = parser.getEventType();//得到第一个事件类型while (eventType != XmlPullParser.END_DOCUMENT) {//如果事件类型不是文档结束的话则不断处理事件switch (eventType) {case (XmlPullParser.START_DOCUMENT)://如果是文档开始事件persons = new ArrayList<Person>();创建一个person集合break;case (XmlPullParser.START_TAG)://如果遇到标签开始String tagName = parser.getName();// 获得解析器当前元素的名称if ("person".equals(tagName)) {//如果当前标签名称是<person>person = new Person();//创建一个personperson.setId(new Integer(parser.getAttributeValue(0)));//将元素的属性值赋值给id}if (person != null) {//如果person已经创建完成if ("name".equals(tagName))//如果当前节点标记是nameperson.setName(new String(parser.nextText()));else if ("age".equals(tagName))//如果当前元素节点标记是ageperson.setAge(new Short(parser.nextText()));}break;case (XmlPullParser.END_TAG)://如果遇到标签结束if ("person".equals(parser.getName())) {//如果是person标签结束persons.add(person);//将创建完成的person加入集合person = null;//并且置空}break;}eventType=parser.next();//进入下一个事件处理}return persons;}。

XML的解析方式有哪几种?有什么区别?

XML的解析方式有哪几种?有什么区别?

XML的解析⽅式有哪⼏种?有什么区别?
有DOM、SAX等。

DOM:(Document Object Model, 即⽂档对象模型) 是 W3C 组织推荐的处理 XML 的⼀种标准⽅式。

DOM中的核⼼概念就是节点。

DOM在分析XML⽂档时,将组成XML⽂档的各个部分(元素、属性、⽂本、注释和处理指令等)映射成⼀个对象,这个对象就叫做节点。

在内存中,这些节点形成⼀颗⽂档树。

整棵树势⼀个节点,树中的每⼀个节点也是⼀颗树(⼦树),我们通过访问树中的节点来存取XML⽂档的内容。

由于树在内存中是持久的,因此可以修改它以便应⽤程序能对数据和结构作出更改。

它还可以在任何时候在树中上下导航,⽽不是像SAX那样是⼀次性的处理。

DOM使⽤起来也要简单得多。

DOM的优点是使⽤⽐较灵活,缺点是需要将整个⽂档加载到内存,对内存消耗⽐较⼤。

SAX(simple api for xml)基于事件.
SAX是基于事件驱动的⼯作⽅式,顺序读取XML⽂件,当遇到⽂件开头,结束,
或标签开头和结束时,会触发⼀个事件。

在读xml的过程会不断抛出对象作为事件参数抛出.在SAX中只能读,不能写,⽽且只读⼀次,其优点是对内存消耗较⼩.。

XML解析方式对比与分析

XML解析方式对比与分析

应用程序设 计时 , 往遵循 “ 息驱动 ”机制 ,当某 一 往 消 事件发生 时 ,会触发此 事件 的后 继操作 。S X解析器 正是基 A
于事件模 型的一种解析方式 。对于顺序到达 的 X ML数据 ,主 解析进程发 现某一个标 签后 ,会 触发该标 签对 应 的动 作 ,告 诉 回调方法标签 已经找到。 实 际应用 中 ,S X对 内存 的要 求 比较 低 ,能获得不 错 的 A 执行 性能 。如果 仅需要处理 部分标签 时 ,S X 的优 势就 更加 A 明显 。同时,S X也具有 自身 的缺 陷 ,当需要对一份 X A ML数 据文 件的多个标 签同时访 问的时候 ,S X的顺 序事 件触发 机 A 制就显得无能 为力 了。 为了更 明确地解 释 S X的工作原理 ,在此模 拟 了以下 的 A
下面给出 S X在 Jv A aa中的应用示例 。首先 ,引入必要 的
本文收稿 日期 :2 1— 2 1 00 0—6
S X支持 包之 后 ,可 构建 基于 S X的解 析 类 ,本文程技巧与维护
“ etA ” T s X 。在 该类 中 ,需要 定义 一个 堆栈 属性 ,用 于存 储 S
cet teD cm n bet o tn ew o L dt. h ut tgacs rbe i sl db t re s m oe- ra ou e t jc cna st h l XM aa T em l—a cespol s o e u al grs t vr eh o i h e i m v a ye
h a. e d Ke r s XML ; AX ; y wo d : S DOM
X ML是 Wol WieWe r d b联盟 ( C d W3 )定义 的元语 言 ,即

xml解析库对比总结(解析方式第三方库TinyXml)

xml解析库对比总结(解析方式第三方库TinyXml)

xml解析库对比总结(解析方式第三方库TinyXml)解析方式:1.事件驱动:事件驱动的解析方式是最常见和常用的解析方式。

在这种解析方式下,解析器遇到XML文件中的每个节点时,会触发一系列的事件,应用程序可以通过注册事件处理器来处理这些事件。

这种解析方式适用于大型XML文件,因为它不需要将整个XML文件加载到内存中。

2.文档对象模型(DOM):DOM解析方式会将整个XML文件加载到内存中,并将其表示为一个树形结构。

通过DOM解析方式,应用程序可以方便地遍历和操作XML文件的内容。

但是,DOM解析方式比较消耗内存,因为它需要将整个文件加载到内存中。

3.流解析:流解析方式将XML文件分割为一系列的事件流,应用程序可以通过处理这些事件流来解析XML文件。

这种解析方式比较高效,可以处理大型XML文件。

但是,它不支持随机访问XML文件。

第三方库:1. libxml2:libxml2是一个功能强大且广泛使用的XML解析库。

它支持DOM和SAX两种解析方式,可以在大多数操作系统上运行。

libxml2具有优秀的性能和稳定性,并提供了丰富的API用于XML的解析和操作。

2. Xerces:Xerces是Apache提供的一个XML解析库。

它是用Java 编写的,支持多种编程语言,如C++、Java和Python。

Xerces提供了DOM和SAX两种解析方式,具有很好的性能和稳定性。

3. Expat:Expat是一个轻量级的XML解析库,专门用于高性能的XML解析。

它支持事件驱动的解析方式,适用于处理大型XML文件。

Expat的代码简洁而高效,易于使用和集成到应用程序中。

TinyXml是一个简单而易于使用的C++ XML解析库。

它支持DOM解析方式,可以在内存中构建整个XML文件的树形结构。

TinyXml 的设计目标是提供一种简单、易于学习和快速入门的XML解析解决方案。

它的代码简洁、易于理解,适用于小型项目和嵌入式系统。

XML的四种解析器原理及性能比较

XML的四种解析器原理及性能比较

XML的四种解析器原理及性能比较XML(可扩展标记语言)是一种非常常见的数据交换格式,用于在应用程序之间传递和存储数据。

在处理XML数据时,需要使用解析器来读取和解析XML文档。

下面将介绍XML的四种解析器的原理和性能比较。

1. DOM解析器(Document Object Model Parser):DOM解析器将整个XML文档加载到内存中,并将其表示为一个树形结构,每个节点都对应XML文档中的一个元素或属性。

解析器可以通过遍历这个树形结构来访问和操作XML数据。

由于将整个文档加载到内存中,DOM解析器所需的内存较大,适合处理比较小的XML文档。

虽然性能较差,但它提供了灵活的访问和操作XML数据的方法。

2. SAX解析器(Simple API for XML Parser):3. StAX解析器(Streaming API for XML Parser):StAX解析器是一种混合了DOM和SAX解析器的解析器,它允许开发人员以推拉模型访问XML数据。

开发人员可以使用迭代器的形式遍历XML文档,并根据需要拉取或推送事件。

StAX解析器的内存需求较低,同时也具备灵活的操作XML数据的能力。

4. JAXB解析器(Java Architecture for XML Binding):JAXB解析器是一种用于将XML数据绑定到Java对象的解析器。

它可以将XML文档中的元素和属性映射到具体的Java类和对象上,并提供了将Java对象序列化为XML的能力。

相比于前三种解析器,JAXB解析器需要定义Java类和XML的映射关系,稍微复杂一些。

但它提供了方便的对象操作方式,可以更加简洁地处理XML数据。

对于解析性能的比较,DOM解析器的性能最差,因为它需要将整个XML文档加载到内存中。

对于大型XML文档,DOM解析器可能会导致内存不足的问题。

SAX解析器和StAX解析器的性能较好,因为它们是基于事件驱动的解析器,可以逐行读取XML文档,无需将整个文档加载到内存中。

XML解析的三种方法

XML解析的三种方法

三种解析XML文件的方法在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。

下面是本例子要解析的XML文件:文件名称:china.xml例子定义了一个javabean用于存放上面解析出来的xml内容,这个javabean为Person,代码:使用SAX读取XML文件SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。

SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。

所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。

下面是一些ContentHandler接口常用的方法:startDocument()当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。

endDocument()和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。

startElement(String namespaceURI, String localName, String qName, Attributes atts) 当读到一个开始标签的时候,会触发这个方法。

namespaceURI就是命名空间,localName 是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。

通过atts可以得到所有的属性名和相应的值。

要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。

XML的四种解析器原理及性能比较

XML的四种解析器原理及性能比较

是用与平台和语言无关地方式表示文档地官方标准. 是以层次结构组织地节点或信息片断地集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次地,因而被认为是基于树或基于对象地.以及广义地基于树地处理具有几个优点.首先,由于树在内存中是持久地,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不是像那样是一次性地处理. 使用起来也要简单得多.另一方面,对于特别大地文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样地数据会更好.这些基于事件地模型,比如.个人收集整理勿做商业用途、:这种处理地优点非常类似于流媒体地优点.分析能够立即开始,而不是等待所有地数据被处理.而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中.这对于大型文档来说是个巨大地优点.事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析.一般来说,还比它地替代者快许多.个人收集整理勿做商业用途、选择还是选择?对于需要自己编写代码来处理文档地开发人员来说,选择还是解析模型是一个非常重要地设计决策. 采用建立树形结构地方式访问文档,而采用地事件模型. 解析器把文档转化为一个包含其内容地树,并可以对树进行遍历.用解析模型地优点是编程容易,开发人员只需要调用建树地指令,然后利用访问所需地树节点来完成任务.可以很容易地添加和修改树中地元素.然而由于使用解析器地时候需要处理整个文档,所以对性能和内存地要求比较高,尤其是遇到很大地文件地时候.由于它地遍历能力,解析器常用于文档需要频繁地改变地服务中. 个人收集整理勿做商业用途解析器采用了基于事件地模型,它在解析文档地时候可以触发一系列地事件,当发现给定地地时候,它可以激活一个回调方法,告诉该方法制定地标签已经找到. 对内存地要求通常会比较低,因为它让开发人员自己来决定所要处理地.特别是当开发人员只需要处理文档中所包含地部分数据时,这种扩展能力得到了更好地体现.但用解析器地时候编码工作会比较困难,而且很难同时访问同一个文档中地多处不同数据. 个人收集整理勿做商业用途、地目地是成为特定文档模型,它简化与地交互并且比使用实现更快.由于是第一个特定模型,一直得到大力推广和促进.正在考虑通过“ 规范请求”将它最终用作“ 标准扩展”.从年初就已经开始了开发.个人收集整理勿做商业用途与主要有两方面不同.首先,仅使用具体类而不使用接口.这在某些方面简化了,但是也限制了灵活性.第二,大量使用了类,简化了那些已经熟悉这些类地开发者地使用.个人收集整理勿做商业用途文档声明其目地是“使用%(或更少)地精力解决%(或更多)问题”(根据学习曲线假定为%). 对于大多数应用程序来说当然是有用地,并且大多数开发者发现比容易理解得多. 还包括对程序行为地相当广泛检查以防止用户做任何在中无意义地事.然而,它仍需要您充分理解以便做一些超出基本地工作(或者甚至理解某些情况下地错误).这也许是比学习或接口都更有意义地工作.个人收集整理勿做商业用途自身不包含解析器.它通常使用解析器来解析和验证输入文档(尽管它还可以将以前构造地表示作为输入).它包含一些转换器以将表示输出成事件流、模型或文本文档. 是在许可证变体下发布地开放源码.个人收集整理勿做商业用途、虽然代表了完全独立地开发结果,但最初,它是地一种智能分支.它合并了许多超出基本文档表示地功能,包括集成地支持、支持以及用于大文档或流化文档地基于事件地处理.它还提供了构建文档表示地选项,它通过和标准接口具有并行访问功能.从下半年开始,它就一直处于开发之中.个人收集整理勿做商业用途为支持所有这些功能,使用接口和抽象基本类方法. 大量使用了中地类,但是在许多情况下,它还提供一些替代方法以允许更好地性能或更直接地编码方法.直接好处是,虽然付出了更复杂地地代价,但是它提供了比大得多地灵活性.个人收集整理勿做商业用途在添加灵活性、集成和对大文档处理地目标时,地目标与是一样地:针对开发者地易用性和直观操作.它还致力于成为比更完整地解决方案,实现在本质上处理所有问题地目标.在完成该目标时,它比更少强调防止不正确地应用程序行为.个人收集整理勿做商业用途是一个非常非常优秀地,具有性能优异、功能强大和极端易用使用地特点,同时它也是一个开放源代码地软件.如今你可以看到越来越多地软件都在使用来读写,特别值得一提地是连地也在用.个人收集整理勿做商业用途、总述和在性能测试时表现不佳,在测试文档时内存溢出.在小文档情况下还值得考虑使用和.虽然地开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处.另外,仍是一个非常好地选择. 实现广泛应用于多种编程语言.它还是许多其它与相关地标准地基础,因为它正式获得推荐(与基于非标准地模型相对),所以在某些类型地项目中可能也需要它(如在中使用).个人收集整理勿做商业用途表现较好,这要依赖于它特定地解析方式.一个检测即将到来地流,但并没有载入到内存(当然当流被读入时,会有部分文档暂时隐藏在内存中).个人收集整理勿做商业用途无疑,是最好地,目前许多开源项目中大量采用,例如大名鼎鼎地也用来读取配置文件.如果不考虑可移植性,那就采用吧!个人收集整理勿做商业用途。

解析xml格式字符串标签数据的方法

解析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解析器。

XML解析——Java中XML的四种解析方式

XML解析——Java中XML的四种解析方式

XML解析——Java中XML的四种解析⽅式XML是⼀种通⽤的数据交换格式,它的平台⽆关性、语⾔⽆关性、系统⽆关性、给数据集成与交互带来了极⼤的⽅便。

XML在不同的语⾔环境中解析⽅式都是⼀样的,只不过实现的语法不同⽽已。

XML的解析⽅式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。

其中前两种属于基础⽅法,是官⽅提供的平台⽆关的解析⽅式;后两种属于扩展⽅法,它们是在基础的⽅法上扩展出来的,只适⽤于java平台。

针对以下XML⽂件,会对四种⽅式进⾏详细描述:<?xml version="1.0" encoding="UTF-8"?><bookstore><book id="1"><name>冰与⽕之歌</name><author>乔治马丁</author><year>2014</year><price>89</price></book><book id="2"><name>安徒⽣童话</name><year>2004</year><price>77</price><language>English</language></book></bookstore>⼀、DOM解析DOM的全称是Document Object Model,也即⽂档对象模型。

在应⽤程序中,基于DOM的XML分析器将⼀个XML⽂档转换成⼀个对象模型的集合(通常称DOM树),应⽤程序正是通过对这个对象模型的操作,来实现对XML⽂档数据的操作。

通过DOM接⼝,应⽤程序可以在任何时候访问XML⽂档中的任何⼀部分数据,因此,这种利⽤DOM接⼝的机制也被称作随机访问机制。

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

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

xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J)第一种:SAX解析SAX处理机制:SAX是一种基于事件驱动的API。

利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。

解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。

测试用的xml文件:db.xmlXml代码<?xml version="1.0"encoding="UTF-8"?><!--<!DOCTYPE dbconfig SYSTEM "db.dtd">--><dbconfig><db type="oracle"><driver>oracle.jdbc.driver.OracleDriver</driver><url>jdbc:oracle:thin:@localhost:1521:oracle</url><user>scott</user><password>tiger</password></db></dbconfig><?xml version="1.0" encoding="UTF-8"?><!--<!DOCTYPE dbconfig SYSTEM "db.dtd">--><dbconfig><db type="oracle"><driver>oracle.jdbc.driver.OracleDriver</driver><url>jdbc:oracle:thin:@localhost:1521:oracle</url><user>scott</user><password>tiger</password></db></dbconfig>DTD文件db.dtdXml代码<!ELEMENT dbconfig (db+)><!ELEMENT db (driver,url,user,password)><!ELEMENT driver (#PCDATA)><!ELEMENT url (#PCDATA)><!ELEMENT user (#PCDATA)><!ELEMENT password (#PCDATA)><!ATTLIST db type CDATA #REQUIRED><!ELEMENT dbconfig (db+)><!ELEMENT db (driver,url,user,password)><!ELEMENT driver (#PCDATA)><!ELEMENT url (#PCDATA)><!ELEMENT user (#PCDATA)><!ELEMENT password (#PCDATA)><!ATTLIST db type CDATA #REQUIRED>SAX解析实例一org.xml.sax.DefalutHandler类: 可以扩展该类,给出自己的解析实现SAXPrinter.javaJava代码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 version=\"1.0\" encoding=\"utf-8 \"?>");}/** *//*** 接收处理指令事件*/public void processingInstruction(String target, String data) throws SAXException{System.out.println("<?"+target+" "+data+"?>");}/** *//*** 元素开始事件* 参数说明:* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3)SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
选择DOM还是选择SAX? 对于需要自己编写代码来处理XML文档的开发人员来说, 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXMM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.
JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。
4)DOM4J
JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。
JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。JDOM对于大多数Java/XML应用程序来说当然是有用的,并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。
1.介绍
1)DOM(JAXP Crimson解析器)
DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。
3)JDOM
JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。正在考虑通过“Java规范请求JSR-102”将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。
2)JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM.虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始,它就一直处于开发之中。
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。
在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。
2)SAX
SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。
相关文档
最新文档