java-工具-XML解析工具对比

-------------------------------------SAX解析xml----------------------------------

》Sax定义

         SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于android等移动设备

         SAX全称是Simple API for Xml,既是指一种接口,也是一个软件包

         作为接口,sax是事件驱动型xml解析的一个标准接口

》Sax特点

        1. 解析效率高,占用内存少

        2.可以随时停止解析

        3.不能载入整个文档到内存

        4.不能写入xml

        5.SAX解析xml文件采用的是事件驱动

        ---sax并不需要解析完 整个文档,在按内容顺序解析文档的过程中,sax会判断当前读到的字符是否合法xml语法中的某部分,如果符合就会触发事件

》Sax工作原理

         Sax的工作原理简单的说,就是对文档进行顺序扫描,扫描到文档(document)开始与结束,扫描到元素(element)开始、结束等地方时调用事件处理

         处理函数做相应动作,然后继续扫描,直到文档结束。

》Sax解析文档过程

           1.继承DefaultHandler  ,并实现方法       

           2.创建SAX解析器工厂

           3.获得解析器

           4.获得输入流

           5.使用输入流,和实现接口作参数,调用解析器的解析方法进行解析

 

》defaultHandler 接口是实现contentHandler接口

         ContentHandler接口中的常用方法

                 >startDocument()

                            当遇到文档开头的时候,调用这个方法,可以在其中做一些与准备工作

                 >endDocument()

                             当文档结束的时候,调用这个方法,可以在其中做一些善后工作

                 >startElement(String namespaceURL, String localName, String qName, Attributes atts)

                             当读到一个开始标签的时候,会触发这个方法。namespaceURL就是命名空间,localName是不带命名空间前缀的标签名,

                             qName是待命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。

                 >endElement(String uri, String localName, String name)

                            当遇到结束标签的时候,调用这个方法

                  >characters(char[] ch, int start, int length)

                            这个方法用来处理在xml文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,

                            使用new String(ch, start, length)就可以获取内容

 

》SAX解析实例

          -------------1.在src下创建xml 文件,并结合成实体类Userinfo.java-------------

<?xml version="1.0" encoding="UTF-8"?>
<admins>
<admin id="1">
<name>阿龙</name>
<age>23</age>
<sex>男</sex>
<email>along@qq.com</email>
</admin>
</admins>

 

          ----------Userinfo.java----

        String name;
int age;
String sex;
String email;
String id;

      。。。  生成get、set方法

     --------------------2.创建XmlPaser继承defaultHandler----------------------

  public class XmlPaser extends DefaultHandler{

        //创建user对象为把查到的内容放到里面

        Userinfo user; 
public Userinfo getUser() {
return user;
}
public void setUser(Userinfo user) {
this.user = user;
}

         //定义标签变量

        String tagName = null;

        //开始文档处理些准备工作

         public void startDocument() throws SAXException { 
user = new Userinfo();
super.startDocument();
}

       

        //读到第一个标签触发

         public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tagName = localName;
if("admin".equals(tagName)){
user.setId(attributes.getValue(0));
System.out.println("id:  "+attributes.getValue(0));
}
}

        

       //读取文本内容

      public void characters(char[] ch, int start, int length)
throws SAXException {
if(tagName!=null){
if("name".equals(tagName)){
String str = new String(ch,start,length);
user.setName(str); 
System.out.println("name:  "+str);
}else if("age".equals(tagName)){
String str = new String(ch,start,length);
user.setAge(Integer.parseInt(str));
System.out.println("age:   "+str);
}else if("sex".equals(tagName)){
String str = new String(ch,start,length);
user.setSex(str);
System.out.println("sex:  "+str);
}else if("email".equals(tagName)){
String str = new String(ch,start,length);
user.setEmail(str);
System.out.println("email:  "+str); 
}
}
}

        //遇到结束标签

       public void endElement(String uri, String localName, String qName)
throws SAXException { 
tagName=null;

}

        //文档读完

public void endDocument() throws SAXException { 
super.endDocument();
}

 }

 

----------------布局文件main省略-----------

----------------------3.-类SAXActivity继承Activity----------------

         Button btnOk;

        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

btnOk = (Button)this.findViewById(R.id.button1);
        btnOk.setOnClickListener(new OnClickListener() {

public void onClick(View v){

//创建解析工厂和解析器

                        SAXParserFactory spf = SAXParserFactory.newInstance();

                        try{

SAXParser sp = spf.newSAXParser();

                                //解析

                               XmlPaser xp = new XmlPaser();

                                InputStream is = this.getClass().getClassLoader().getResourceAsStream("user.xml");

sp.parse(is,xp);

 

//获得读取到的内容

                                 Userinfo user = xp.getUser();

//在页面显示

.................

}

}

       });

     }

 

---------------------------------------Dom解析Xml--------------------------------------------

》DOM简介

        dom全称Document Object Model ,为xml文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个主流内存的树结构,

         然后代码就可以使用dom接口来操作这个树结构

》DOM的特点

         >优点

                  1.整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能

                  2.通过树形结构存取xml文档

                  3.可以在树的某个节点上向前或向后移动

           >缺点

                  1.将整个文档调入内存(包括无用的节点),浪费时间和空间

            >适用场合

                  一旦解析了文档还需多次访问这些数据;硬件资源充足(内存,cpu)

》DOM解析步骤

      1.创建解析器工厂

      2.获得解析器工厂

      3.接受一个xml文档作为输入参数名,并得到一个xml的文档对象(Document)

      4.操作文档对象

 

》解析实例:

-----------------------1.创建要解析的xml文件、和实体类(Person)---------------------------

<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1">
<name>Tom</name>
<age>19</age>
</user>
<user id="2">
<name>Jaary</name>
<age>18</age>
</user>
</users>

 

实体类 略

-----------------------2. Dom解析(DomService.java)-----------------------------------

public List<Person> getPersons(InputStream input) throws Throwable{

//获得解析器工厂

         DocumentBuilderFactory    factory = DocumentBuilderFactory.newInstance();

         //获得解析器

          DocumentBuilder builder = factory.newDocumentBuilder();

        //进行解析

         Document  doc = builder.parse(input);

 

        List<Person> personlist = new new ArrayList<Person>();

       //获得所有叫user的节点

        NodeList  list = doc.getElementsByTagName(user);

        String id="";
String name="";
String age="";
for(int i=0;i<list.getLength();i++){
//取得第i个user节点
Element node=(Element)list.item(i);
Person p=new Person();
//获取id属性
id=node.getAttribute("id");
//获得user节点下的子节点列表
NodeList userList=node.getChildNodes();
for(int j=0;j<userList.getLength();j++){
//判断是否是元素节点,name和age属于元素节点
if(userList.item(j).getNodeType()==Node.ELEMENT_NODE){

Element childNode=(Element)userList.item(j);
if("name".equals(childNode.getNodeName())){
name=childNode.getFirstChild().getNodeValue();
}
else if("age".equals(childNode.getNodeName())){
age=childNode.getFirstChild().getNodeValue();
}
p.setName(name);
p.setAge(age);
p.setId(Integer.parseInt(id));
}

}

personList.add(p);
}
return personList;

}

-------------------------3.Activity01继承Activity类----------------------------------------------------

 

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        InputStream is=this.getClass().getClassLoader().getResourceAsStream("test.xml");
        DomService dom=new DomService();
        
        try {
List<Person> ps=dom.getPersons(is);
for(Person p:ps){
System.out.println(p.getId());
System.out.println(p.getName());
System.out.println(p.getAge());
}
} catch (Exception e) { 
e.printStackTrace();
}
    }

 

--------------------------------------pull解析-----------------------------

》pull解析器简介

        1.pull解析器是android内置的解析器,解析原理与sax类似

        2.pull它提供了类似的事件。

              如:开始元素和结束元素事件,使用parse.next()可以进入下一个元素并触发相应的事件,事件将作为数值代码被发送

                      因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法获取下一个Text类型节点的值 

 

》pull与sax的不同之处

          1.pull读取xml文件后触发相应的事件调用方法返回的是数字。

          2.pull可以在程序中控制,想解析到哪里就可以停止到哪里

          3.Android中更推荐使用pull解析

 

》pull解析步骤

      1.创建解析器对象

          XmlPullParser paser = Xml.newPullParser();

      2.进行解析

             paser.setInput(input,"utf-8");

      3.产生第一个解析事件

              int eventType = paser.getEventType();

       4.可以使用循环判断是否继续解析

                while(eventType!=XmlPullParser.END_DOCUMENT){}

 

 

 

 

》解析实例

-------------------1。创建xml.及实例对象(Person.java)----------------略

--------------------2.pull解析(PullService .java)----------------------

List<Person> getAlPerson(InputStream is) throws XmlPullParserException, IOException{

List<Person> persons=null;
Person p=null;
XmlPullParser parser=Xml.newPullParser();
parser.setInput(is,"utf-8");
//获得事件类型
int type=parser.getEventType();
while(type!=XmlPullParser.END_DOCUMENT){

switch(type){

case XmlPullParser.START_DOCUMENT://文档开始
persons=new ArrayList<Person>();
break;
case XmlPullParser.START_TAG://元素开始
if(parser.getName().equals("user")){

p=new Person();
String id=parser.getAttributeValue(0);
p.setId(Integer.parseInt(id));
}
else if(parser.getName().equals("name")){
if(p!=null){

String name=parser.nextText();
p.setName(name);
}
}
else if(parser.getName().equals("age")){

String age=parser.nextText();
p.setAge(age);
}
break;
case XmlPullParser.END_TAG:
if("user".equals(parser.getName())){

persons.add(p);
p=null;
}
break;

}
type=parser.next();
}
return persons;
}
}

------------------------------------Activity类-----------------------------------

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        InputStream is=this.getClass().getClassLoader().getResourceAsStream("test.xml");
        PullService pps=new PullService();
        
        try {
List<Person> ps=pps.getPersons(is);
for(Person p:ps){
System.out.println(p.getId());
System.out.println(p.getName());
System.out.println(p.getAge());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    }

 

SAX、DOM、PULL的比较

SAX、DOM、PULL各有自己的特点,具体操作XML的时候该如何选择呢?

1.内存占用

这是一个根本性问题。由于Android手机性能相对于现在的应用操作还是有限的,程序对内存的占用直接影响到了解析XML的速度。在这点上,SAX、Pull以它们比DOM占用更少的内存的解析方式,更适合于Android手机开发。

2.编程方式

SAX采用事件驱动,在相应事件触发的时候,会调用用户编写好的方法。也就是说,每解析一类XML,就要编写一个新的适合该类XML的处理类。这显然不是一个好的解决办法,尽管其在解析速度上是那么优秀。而这点,DOM因为是W3C的规范。所以被更多程序员所知道和使用。所以在开发过程中,没有太大困难。Pull虽然属于一个小众的,甚至是不为人知的解析器,但是通过上面对其介绍和示例,我们应该能看出它的简洁性。

3.访问与修改

由于采用的是流式解析,这就说明它们不能像DOM那样随机访问,XML的其中任意一个节点。并且,SAX并没有提供对文档中加节点的API,更没有删除,修改文档内容的方法。

4.访问方式

这是产生它们解析快慢的根本原因。如果把SAX和Pull比喻成一目十行,很快但是是走马观花的阅读方式的话,那么DOM就是逐字逐句的阅读,很慢,但是是过目不忘。这里还要需要注意的是,SAX,Pull解析的方式是同步的,即解析器读到哪里,就对哪里进行处理。而DOM是已经将文件解析好后,供用户提取XML中感兴趣的信息。

总结:

出于对内存占用的考虑,推荐使用SAX或者Pull来工作。可是根据它们工作的原理:如果只是需要XML最后的几个节点的相关信息,或者出现反复检索XML文件的情况。那么基本上三者在性能上就没有什么差异,反而在这时,SAX的处理类会使程序显得比其他的实现方式显得臃肿。所以,想做一个高性能的Android软件,还是要多分析,选择合适的工具,才能发挥它的作用。

时间: 2024-11-05 16:30:21

java-工具-XML解析工具对比的相关文章

JSON解析和XML解析区别对比_Android

JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和XML解析均是在安卓环境下进行测试. 首先要明确一点,数据解析是为了获取数据的每一个值,对于JSON数据而言类似于键值对的形式,对于XML而言是标签和值的形式.简单来说就是要在一个JSON数据或XML数据中利用键或标签找到对应值. 其次要了解一下两种数据的数据结构.JSON数据分为三种:对象类型.数

JSON解析和XML解析区别对比

JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和XML解析均是在安卓环境下进行测试. 首先要明确一点,数据解析是为了获取数据的每一个值,对于JSON数据而言类似于键值对的形式,对于XML而言是标签和值的形式.简单来说就是要在一个JSON数据或XML数据中利用键或标签找到对应值. 其次要了解一下两种数据的数据结构.JSON数据分为三种:对象类型.数

Java:JSON解析工具-org.json

一.简介  org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下.  二.准备  1.在使用org.json之前,我们应该先从该网址https://github.com/douglascrockford/JSON-java下载org.json源码,并将源码其加入到Eclipse中,即可调用.  2.查看相关的API文档,访问:https://github.com/douglascrockford/JSON-java. 

写了一个Java读取XML文件的工具类

xml 如果我们有下面的一个XML文件,可以把它想象成一个Relation Database中的Table, 这个XML文件就是一个名字为managers的关系表,而一个<manager>所包含的就是一条记录(Record),而manager中的service和implementation就是一个个的栏位(Field) ! managers table  +  service implementation net.csdn.blog.xport.IDBConnectionManager net

Java处理XML的三种主流技术一些总结和介绍

最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记语言可扩展,严格的语法规定,可使用有意义的标记,内容存储和表现分离等等优势注定了该语言从诞生之日起就会走向辉煌. XML 语言在成为 W3C 标准之后进入到了一个快速发展的时期,当然它本身所具有的一系列优点和优势也注定了各大技术厂商对它的偏爱,Java 作为软件行业的一种开发技术也迅速作出了反应,出现了多种对 XML 支持的工具,本文将会从这个角度对 Jav

Java 处理 XML 的三种主流技术及介绍

XML (eXtensible Markup Language) 意为可扩展标记语言,它已经是软件开发行业中大多数程序员和厂商用以选择作为数据传输的载体.本文作者对于 Java 处理 XML 的几种主流技术进行一些总结和介绍,希望帮助那些有不同需求的开发人员对于 XML 处理技术的作出最优的选择. 最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记语言可扩展,严格的语法规定,可使用有意义的标记,内容 存储和

XML解析

xml 简介 May 2000 MSXML Technology Preview 的关键功能之一是实现了 SAX2 (Simple API for XML, version 2).MSDN XML 开发人员中心提供的题为 XML 开发人员的 SAX2 快速入门一文和可下载的 Microsoft Visual C++ 应用程序,可作为 SAX2 的简介.在本文中,我将概述用 Visual Basic 编制 SAX2 接口的方式.请注意,不对本示例提供技术支持,本示例的目的仅是帮助您建立 SAX/V

iOS开发之网络数据解析(二)--XML解析简介

前言:本篇随笔介绍的是XML解析.   正文:   1.XML解析方式有2两种: DOM:一次性将整个XML数据加载进内存进行解析,比较适合解析小文件 SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件   2.IOS中XML解析方案有很多种: 2-1.第三方框架: libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX解析 GDataXML:DOM方式解析,由Google开发,基于libxml2 2-2.苹果原生 NSXMLParser:SAX方式解

iOS开发使用XML解析网络数据_IOS

前言:本篇随笔介绍的是XML解析. 正文: 1.XML解析方式有2两种: DOM:一次性将整个XML数据加载进内存进行解析,比较适合解析小文件SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件 2.IOS中XML解析方案有很多种: 2-1.第三方框架: libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX解析 GDataXML:DOM方式解析,由Google开发,基于libxml2 2-2.苹果原生 NSXMLParser:SAX方式解析,使用简单