java解析xml文件的四种方法详细讲解

java 解析 xml的四种方法为:Dom , Dom4j ,Sax , jdom    

一。sax,dom,jdom,dom4j的比较以及选择
SAX:
 SAX分析器在对XML文档进行分析时,触发一系列的事件,应用程序通过事件处理函数实现对XML文档
的访问。由于事件触发本身是有时序性的,因此,SAX分析器提供的是一种对XML文档的顺序访问机制,
对于已经分析过的部分,不能再倒回去重新处理。SAX之所以被叫做"简单"应用程序接口,是因为SAX
分析器只做了一些简单的工作,大部分工作还要由应用程序自己去做。也就是说,SAX分析器在实现时,
它只是顺序地检查XML文档中的字节流。判断当前字节是XML语法中的哪一部分,检查是否符合XML语法
并触发相应的事件。对于事件处理函数本身,要由应用程序自己来实现。同DOM分析器相比,SAX分析器
对XML文档的处理缺乏一定的灵活性,然而,对于那些只需要访问XML文档中的数据而不对文档进行更改
的应用程序来说,SAX分析器的效率则更高。由于SAX分析器实现简单,对内存要求比较低,因此实现效
率比较高同时具有广泛的应用价值。


DOM:
  DOM分析器通过对XML文档的分析,把整个XML文档以一棵DOM树的形式存放在内存中,应用程序可以
随时对DOM树中的任何一个部分进行访问与操作,也就是说,通过DOM树,应用程序可以对XMLwen档进
行随机访问。这种访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中
的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当XML文档比较大或
者文档结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项比较耗时的
操。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器的树结
构的思想与XML文档的结构相吻合,而且,通过DOM树机制很容实现随机访问。因此DOM分析器也有较为
广泛的使用价值。

JDOM
  JDOM是处理XML的纯JAVA API。使用具体类而不用接口,既要生成大多数节点类型的实例,只要将
一两个变元传入即可。是目前表现优秀的处理XML的JAVA API。



SAX
  优点:①无需将整个文档加载到内存,因而内存消耗少
      ②推模型允许注册多个ContentHandler 
  缺点:①没有内置的文档导航支持
      ②不能够随机访问XML文档
      ③不支持在原地修改XML 
      ④不支持名字空间作用域最适合于:只从XML读取数据的应用程(不可用于操作或修改XML文档)


DOM 
   优点:①易于使用
       ②丰富的API集合,可用于轻松地导航
       ③整棵树加载到内存,允许对XML文档进行随机访问

   缺点:①整个XML文档必须一次解析完
        ②将整棵树加载到内存成本较高
        ③一般的DOM节点对于必须为所有节点创建对象的对象类型绑定不太理想最适合于:需要修改
XML文档的应用程序或XSLT应用程序(不可用于只读XML的应用程序) 
 

JDOM
   优点:①是基于树的处理XML的Java API,把树加载在内存中
       ②没有向下兼容的限制,因此比DOM简单
       ③速度快,缺陷少
       ④具有SAX的JAVA规则
  缺点:①不能处理大于内存的文档
       ②JDOM表示XML文档逻辑模型。不能保证每个字节真正变换。
       ③针对实例文档不提供DTD与模式的任何实际模型。
       ④不支持与DOM中相应遍历包最适合于:JDOM具有树的便利,也有SAX的JAVA规则。在需要平
衡时使用DOM4J虽然DOM4J 代表了完全独立的开发结果,但最初,它是JDOM 的一种智能分支。它合并
了许多超出基本XML文档表示的功能,包括集成的XPath 支持、XML Schema 支持以及用于大文档或
流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API 和标准DOM 接口具
有并行访问功能。从2000 下半年开始,它就一直处于开发之中。为支持所有这些功能,DOM4J 使用接
口和抽象基本类方法。DOM4J 大量使用了API 中的Collections 类,但是在许多情况下,它还提供
一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DoM4J 付出了更复杂的API
 的代价,但是它提供了比JDOM 大得多的灵活性。在添加灵活性、XPath 集成和对大文档处理的目标
时,DOM4J 的目标与JDOM 是一样的:针对Java 开发者的易用性和直观操作。它还致力于成为比
JDOM 更完整的解决方an,实现在本质上处理所有Java/XML 问题的目标。在完成该目标时,它比
JDOM 更少强调防止不正确的应用程序行为。DOM4J 是一个非常非常优秀的Java XML API,具有
性能优异、功能强大和极端易用使用
的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java 
软件都在使用DOM4J 来读写XML,特别值得一提的是连Sun 的JAXM 也在用DOM4J。


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


SAX表现较好,这要依赖于它特定的解析方式。一个SAX 检测即将到来的XML流,
但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。无疑,
DOM4J是最好的,目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate 也用DOM4J 来
读取XML 配置文件。如果不考虑可移植性,那就采用DOM4J吧!

 

 一.DOM解析XML

需要的引用的类:

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

//下面主要是org.xml.sax包的类

扫描二维码关注公众号,回复: 821093 查看本文章

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

步骤:

     1.得到DOM的解析工厂:

DocumentBuilderFactory  factory

=  DocumentBuiderfactory.newInstance();

得到javax.xml.parsers.DocumentBuilderFactory;类的实例就

是我们要的解析器工厂

 

         2.DOM工厂获得DOM解析器(DOmBuilder

              DocumentBuilder builder = factory.newDocumnetBuid();

 通过javax.xml.parsers.DocumentBuilderFactory实例的静态

 方法newDocumentBuilder()得到DOM解析器

 

        ( 3.把要解析的xml文档转化为输入流,以便DOM解析器解析它

  InputStream in = new InputStream(user.xml);

InputStream 是一个接口

         

          4.解析xml文档的输入流 ,得到一个Document

 Document doc = builder.parse(in);

XML文档的输入流得到一个org.w3c.dom.Document对象,

以后的处理都是对Document对象进行的

<!--[if !supportLists]-->5.<!--[endif]--> 得到xml文档的根节点

Element root = document.getDocumentElement();

 DOM中只有根节点是一个org.w3c.dom.Element对象

 

<!--[if !supportLists]-->6.<!--[endif]--> 得到节点的子节点

   NodeList users =root.getChildNodes();

Forint i=0;i<users.getLength();i++{

    Node user = users.item(i);

}

这是用一个org.w3c.dom.NodeList接口来存放它所有子节点的,

还有一种轮循子节点的方法,后面有介绍

 

<!--[if !supportLists]-->7.<!--[endif]--> 取得节点的属性值

String name = user.getAttributes().getNamedItem(name);

节点的属性也是它的子节点。它的节点类型也是node.ELEMENT_NODE

 

<!--[if !supportLists]-->8.<!--[endif]--> 轮循子节点

  For(Node node = user.getFirstChild();node!=null;node=node.getNextSibling()){

If(node.getNodeType()==Node.Element_NONE){

  If(node.getNodeName().equals(name)){

  String name=node.getNodeValue();

                                         String name1=node.getFirstChild().getNodeValue();

                                          System.out.println(name);

                                           System.out.println(name1)

}

}

}

子节点的节点类型也是Node.ELEMENT_NODE型的,node.getNextSibling()方法是取下一个相邻的节点

<!--EndFragment-->

    

2.SAX解析XML

    

 

 

SAX解析xml

   1.编写java代码解析xml

<!--[if !supportLists]-->1.<!--[endif]-->创建SAXParserFactory

SAXParserFactory spf = SAXParserFactory.newInstance();

<!--[if !supportLists]-->2.<!--[endif]-->创建SAXParser:

 SAXParser sp = spf.newSAXParser(); 

          3. SaxParserService handle = new SaxParseService();

          4. 解析XML文档,并回调处理器的相应事件

 Sp.parse(file,handle);

           5.实现startElement......)和EndElement......),characters(.....)方法

 

 

3.DOM4j解析xml

http://wenku.baidu.com/view/0231eb482e3f5727a5e96209.html讲得很详细,在这里不细说了

<!--EndFragment-->

 

4.JDOM解析xml

 

//创建一个SAXBuilder对象
              SAXBuilder saxBuilder = new SAXBuilder();            
            //读取prop.xml资源
              Document doc = saxBuilder.build("src/users.xml");
            //获取根元素(prop)
            Element root = doc.getRootElement();
            //获取根元素下面的所有子元素(mess)
            List<Element> messList = root.getChildren("users");
            //子根元素(mess)
            Element childrenRoot = null;
            //property元素集合
              List<Element> propertyList = null;
            //遍历根元素的子元素集合(即遍历mess元素)
            for(int i = 0; i < messList.size(); i++){
                 //将根元素prop下的mess子元素作为一个新的子根元素
                   childrenRoot = messList.get(i);
                //获取子根元素mess下的所有property子元素
                   propertyList = childrenRoot.getChildren("type");
                //遍历子根元素的子元素集合(即遍历property元素)
                for(int j = 0; j < propertyList.size(); j++){
                    //获取property元素
                       Element element = propertyList.get(j);
                       System.out.println(element.getAttributeValue("uuid"));
                    //element.getAttributeValue("name"):获取property中name属性的值
                       if(element.getAttributeValue("name").equals(name)){        //如果name的值一致
                          return element.getAttributeValue("value");            //取得name对应的value属性值
                       }
                }
            }
            //遍历完没有查找到结果返回null
            return null;

 

<!--EndFragment--><!--EndFragment--><!--EndFragment-->

猜你喜欢

转载自janne.iteye.com/blog/2216580