DOM和SAX解析XML的区别

解析xml有四种方法:DOM,SAX,DOM4j,JDOM.
     我们主要学了两种:DOM和SAX.
     DOM适于解析比较简单的XML而SAX则适于解析较复杂的XML文件。各有各的好。

DOM和SAX的不同:
     1. DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中。从而消耗很大的内存空间。而SAX是基于事件的。当某个事件被触发时,才获取相应的XML的部分数据,从而不管XML文件有多大,都只占用了少量的内存空间。
     2. DOM可以读取XML也可以向XML文件中插入数据,而SAX却只能对XML进行读取,而不能在文件中插入数据。这也是SAX的一个缺点。
     3.SAX的另一个缺点:DOM我们可以指定要访问的元素进行随机访问,而SAX则不行。SAX是从文档开始执行遍历的。并且只能遍历一次。也就是说我们不能随机的访问XML文件,只能从头到尾的将XML文件遍历一次(当然也可以中间截断遍历)。

DOM和SAX对XML文件的解析:
     1.  在使用DOM解析XML时,我们首先需要通过DocumentBuilderFactory这个类得到一个工厂的API,使应用程序能够从XML文档获取 生成对象树的解析器。通过此类的 newinstance() 方法我们可以获得此类的一个新实例。然后通过创建DocumentBuilder的实例使其从XML文档中获取DOM文档实例。 DocumentBuilder的实例我们可以通过DocumentBuilderFactory类的newDocumentBuilder()方法得 到。之后就通过DocumentBuilder类的parse(InputStream is)方法将给定文件的内容解析为一个XML文档,并且返回一个新的DOM Document 对象。具体步骤如下:

File file = new File("D:\\编码\\xml\\domxml.xml");
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document dt = db.parse(file);
        } catch (Exception e) {
            // TODO 自动生成 catch 块
            e.printStackTrace();
        }

这 时我们就可以开始解析文档了。通过NodeList,Node分别可以得到节点列表和节点了。NodeList可以由Document对象的 getElementsByTagName("元素名称");来得到你想得到的哪个元素的节点列表。由NodeList的item(整形参数)方法来得到 节点。通过Node的getFirstChild().getNodeValue()方法可以得到文本节点值。方法如下:

NodeList nl = dt.getElementsByTagName("star");//star为一个元素名称
        Node nd = nl.item(0);//得到节点列表 nl 的第一个节点。

此外我们可以通过循环来取得节点列表中所有的节点。
当一个元素有子元素时我们可以通过父节点列表取得子节点列表。方法如下:

NodeList nlF = dt.getElementsByTagName("star"); //star为一个元素名称
       Node ndF = nl.item(0); //得到节点列表 nl 的第一个节点。
       for(int i = 0; i < nlF.getLength(); i ++)
        {
            Node ndF = nlF.item(i); //取得元素的所有节点
            NodeList nlC = ndF.getChildNodes(); //取得子元素的节点列表
            for(int j = 0; j < nlC.getLength(); j ++)
            {
                Node ndC = nlC.item(j);
                if(ndC.getNodeType()==ndC.ELEMENT_NODE){
                    String str = ndC.getFirstChild().getNodeValue(); //取得文本节点
                    System.out.println(str); //打印出文本节点
                    }
                }
            }
        } 
/** 注意*/ 由于通过父节点列表得到子节点列表而得到的子元素节点包含了空格所占有的节点,所以这里需要用if(ndC.getNodeType()== ndC.ELEMENT_NODE)来做判断是否取得的是元素节点(ndC.getNodeType()为节点类型,ndC.ELEMENT_NODE节 点类型为元素节点(注:文本节点是元素节点的一个子节点))。

2. 最常用的SAX解析器是JAXP。JAXP是作为javax.xml包提供的,包括SAX和DIM的Java接口以及Java XML解析器必须是实现的基本接口和类。通过继承DefaultHandle类实现此类方法则可以遍历XML文档:

void startDocument()
         //接收文档开始的通知
         void endDocument()
         //接收文档结束的通知 
         void startElement(String uri,String localName,String qName, Attributes attributes)
         //接收元素开始的通知
         void endElement(String uri,String localName, String qName)
         //接收元素结束的通知
         void characters(char[] ch,int start, int length)
         //接收字符数据的通知

获取SAX解析器的方法和DOM相似。获取SAX解析器的方法如下:
          
         SAXParserFactory spf = SAXParserFactory.newInstance(); //得到工厂的一个新实例
        try {
            
            SAXParser sp = spf.newSAXParser(); //得到SAXParser类的实例
            File file = new File("E:\\yuxin_document\\xml\\mytest.xml"); //XML文件
            SaxHandle handle = new SaxHandle(); //SaxHandle 这是一个继承了DefaultHandle的实现了XML遍历                                                             的一个自定义的类
            sp.parse(file, handle); //解析一个XML文档
        } catch (ParserConfigurationException e) {
            // TODO 自动生成 catch 块
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO 自动生成 catch 块
            e.printStackTrace();
        } catch (IOException e) {
            // TODO 自动生成 catch 块
            e.printStackTrace();
        }

** 为了能够清晰的显示出XML中的内容,我们还需要将解析后取得的内容显示在GUI上。一般用表格来实现。
     
     SAX和DOM的合用
     我们可以用SAX来解析XML再用DOM来将解析后的数据写成一个XML文件.
     使用DOM创建一个XML文件的方法如下:
    首先,需要得到一个写入XML文件的Document对象:
        Document doc = DocumentHelper.createDocument();
    然后就可以在这个文档中添加内容了,如:
        Element root = doc.addElement("root");  //写入一个根元素"root"
        Element el = root.addElement("子元素"); //在根元素中写入一个子元素

当将所有信息写入文档后则可以将Document写入XML文件中了,方法如下:

FileWriter file = new FileWriter("D:\\doc.xml"); //得到一个文件输出流对象
        document.write(file); //将文档内容写入文件中(document是上面所得到的Document
对象)
    这是一种简单的写入方式
    如果你想格式化XML文件则可以这样做:

FileOutputStream fos = new FileOutputStream("D:\\doc.xml"); //

得到一个文件输出流对象
        OutputFormat format = OutputFormat.createPrettyPrint();  //得到OutputFormat

格式化类的对象
        XMLWriter xw = new XMLWriter(fos,format);  //得到XML输出流XMLWriter接口的一

个实例
        xw.write(doc);  //将文档写入XML
        fos.close();  //关闭输出流
        xw.close();

时间: 2024-10-13 17:39:42

DOM和SAX解析XML的区别的相关文章

XML学习笔记(二):使用 DOM和SAX 解析XML :

一.XML解析的简介 1.一般来说xml解析的方式有两种,Dom与SAX,且各有优缺点.pull是第三种方法见:pull解析XML 1)DOM:dom对象树 ①.整个XML放入内存,转换为Document对象: ②.每个元素,转换成Element对象 ③.文本,转换成Text对象 ④.属性,转换成Attribute对象 优缺点:元素的CRUD比较简单,但是内存消耗大,大的xml文档不适合. 补充:内存不足时,可以修改参数,调整JVM的内存大小 1.java.lang.OutOfMemoryErr

Java SE之XML&lt;二&gt;XML DOM与SAX解析

[文档整理系列] Java SE之XML<二>XML DOM与SAX解析 XML编程:CRUD(Create Read Update Delete) XML解析的两种常见方式: DOM(Document Object Model): 特点:树状解析 优点:[更适合对XML文档的(crud)操作.]对XML文档增删改查操作很方便灵活 缺点:内存消耗很大,不适合数据量很大,节点很多的XML文档. SAX(Simple API for XML): 特点:自上往下顺序解析 优点:[占用内存小,解析速度

DOM&amp;SAX解析XML

在上一篇随笔中分析了xml以及它的两种验证方式.我们有了xml,但是里面的内容要怎么才能得到呢?如果得不到的话,那么还是没用的,解析xml的方式主要有DOM跟SAX,其中DOM是W3C官方的解析方式,而SAX是民间(非官方)的,两种解析方式是很不一样的.下面通过例子来分析两种解析方式的区别. 下面是要解析的xml文档 1 <?xml version="1.0" encoding="utf-8"?> 2 <学生名册> 3 <!--http

XML - 十分钟了解XML结构以及DOM和SAX解析方式

引言 NOKIA 有句著名的广告语:"科技以人为本".不论什么技术都是为了满足人的生产生活须要而产生的.详细到小小的一个手机.里面蕴含的技术也是浩如烟海.是几千年来人类科技的结晶,单个人穷其一生也未必能掌握其一角.只是个人一直觉得主要的技术和思想是放之四海而皆准的,很多技术未必须要我们从头到尾再研究一遍.我们要做的就是站在巨人的肩膀上.利用其成果来为人们的需求服务. 随着移动互联网时代的大潮.越来越多的App不光是须要和网络server进行数据传输和交互,也须要和其它 App 进行数据

Java sax、dom、pull解析xml

-------------------------------------SAX解析xml---------------------------------- >Sax定义 SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于android等移动设备 SAX全称是Simple API for Xml,既是指一种接口,也是一个软件包 作为接口,sax是事件驱动型xml解析的一个标准接口 >Sax特点 1. 解析效率高,占用内存少 2.可以随时停止解析 3.不能载入整个文档到内存 4.

Sax,Dom,Full解析xml文件

1.Sax解析xml文件 Sax解析读取一点,解析一点,适合读取大容量的xml文件,从上往下逐点读取,不能往回读,Sax解析通常只读取文件,不能修改文件. 1.1将user.xml传到assets中 <?xml version="1.0"encoding="UTF-8"?><list><user> <username>root</username> <password>root</pass

SAX解析XML

SAX 事件处理(事件驱动),不需要载入整个文档,流机制读取,分析XML文档 startDocument startElement character endElement endDocument 当sax扫描到文档时就调用startDocument函数,sax扫描到文档结束符时就调用endDocument函数,也就是说当sax扫描到哪个节点时就会调用相应的函数,同时还会携带节点的属性值. 当它扫描到节点内容值时就会调用character函数 Sax主要是用来对xml文件遍历,解析,不提供修改.

6. SAX解析XML

SAX解析: SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分: 解析器和事件处理器 : 1. 解析器可以使用SAXP的API创建,创建出SAX解析器后, 就可以指定解析器去解析某个XML文档. 解析器采用SAX方式在解析某个XML文档时, 它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法, 解析器在调用事件处理器的方法时, 会把当前解析到的xml文件内容作为方法的参数传递给事件处理器. 2. 事件处理器由程序员编写,程序员通过事件处理器

SAX解析XML文件

SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准.SAX是一种轻量型的方法,不像DOM解析时,把XML文档全部载入内存中,在PC上操作,Dom还有 优势,但在手机中端上则无优势,因为手机内存和硬件都比不上PC强.使用 SAX 是比较安全的,并且 Android 提供了一种传统的 SAX 使用方法,以及一个便捷的 SAX 包装器.SAX采用基于事件驱动的处理方式,它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理. 在SAX接口中,事件源是org