zoukankan      html  css  js  c++  java
  • DOM和SAX是应用中操纵XML文档的差别


    DOM和SAX是应用中操纵XML文档的两种主要API。它们分别解释例如以下:
             DOM。即Document Object Model,中文叫文档对象模型。DOM是W3C定义的标准文档对象模型。是一个与操作系统和编程语言无关的、用于内存存储和操作层次化文档的模型。当按 照DOM模型解析XML文档时,就会在内存中构造一个相应的DOM树,它能够用于不同
    节点之间的遍历。然而,在遍历之前必须先完毕DOM树的构造。

    因此, 在处理规模较大的XML文档时就非常耗内存,占用资源较多。

    尤其是仅仅须要操作文档中一小部分时效率非常低。

            SAX。即Simple API for XML的简称。中文叫XML简单应用程序接口。它是一个其实的标准。与DOM不同的是,它是用事件驱动模型。解析XMl文档时每遇到一个開始或者结束标 签、或者属性、或者一条指令时,程序就产生一个事件来进行对应的处理。所以在操作文档之前不须要对整个文档进行解析。实际上,文档的各个部分能够在进行解 析的同一时候进行操作。

    因此,SAX相对于DOM来说更适合操作大文档。

     
    SAX与DOM之间有一些显著差别,包含:
            DOM是复杂对象处理的首选,比方当XML比較复杂的时候,或者当你须要随机处理文档中数据的时候。

    SAX从文档的開始通过每一节点移动。以定位一个特定的节点。 DOM为加载到内存的文档节点建立类型描写叙述。终于,这些描写叙述呈现了可easy横向移动、潜

    在巨大、树型结构。

    假设XML非常冗长,DOM就会显示出无法控制的胀 大。比如,一个300KB的XML文档能够导致RAM或者虚拟内存中的3。000。000KB的DOM树型结构。

    通过比較就会发现。

         一个SAX文档根本就 没有被解构。它也没有隐藏在内存空间中(当然当XML流被读入时,会有部分文档临时隐藏在内存中)。SAX就是一种“更轻巧的”技术──它能够给你的系统 带来更轻的负担。SAX相当于观看一场马拉松比赛,而DOM就好比邀请全部的比赛选手到家里參加晚餐。
    所以。你怎样选择SAX和DOM?假设你处理复杂的东西,比方高级XSLT转换,或者Xpath过滤,请选择使用DOM。假设你建立或者更改XML文档。你也能够选择DOM。相反,你能够使用SAX来查询或者阅读XML文档。SAX能够高速扫描一个大型的XML文档,当它找到查询标准时就会马上停止,然后再处理之。

    在某些情况下。在一个方案中,最佳的选择是使用DOM和SAX处理不同的部分。比如,你能够使用DOM将XML加载到内存并改变它,然后通过从DOM树中发送一个SAX流而转移最后的结果。

     
    SAX概念
    SAX是Simple API for XML的缩写,它并非由W3C官方所提出的标准,能够说是“民间”的事实标准。

    实际上。它是一种社区性质的讨论产物。尽管如此,在XML中对SAX的应用丝毫不比DOM少。差点儿全部的XML解析器都会支持它。

     
    与DOM比較而言,SAX是一种轻量型的方法。

    我们知道,在处理DOM的时候。我们须要读入整个的XML文档,然后在内存中创建DOM树,生成 DOM树上的每一个Node对象。当文档比較小的时候,这不会造成什么问题,可是一旦文档大起来,处理DOM就会变得相当费时费力。

    特别是其对于内存的需 求,也将是成倍的增长,以至于在某些应用中使用DOM是一件非常不划算的事(比方在applet中)。这时候,一个较好的替代解决方法就是SAX。

     
    SAX在概念上与DOM全然不同。

    首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不须要读入整个文档,而文档的读入过程也就是 SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序执行方法。(假设你对Java新的代理事件模型比較清楚的话,就会非常容 易理解这样的机制了)

     
    在XMLReader接受XML文档,在读入XML文档的过程中就进行解析。也就是说读入文档的过程和解析的过程是同一时候进行的。这和DOM差别非常 大。

    解析開始之前,须要向XMLReader注冊一个ContentHandler,也就是相当于一个事件监听器,在ContentHandler中定义 了非常多方法。比方startDocument(),它定制了当在解析过程中,遇到文档開始时应该处理的事情。

    当XMLReader读到合适的内容。就会抛 出对应的事件。并把这个事件的处理权代理给ContentHandler。调用其对应的方法进行响应

    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;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    public class DOMParsePage {
    public DOMParsePage() {
                    DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
        try {
                    DocumentBuilder dombuilder=domfac.newDocumentBuilder();
                    InputStream is=new FileInputStream("C:/123.xml");
                    Document doc=dombuilder.parse(is);
                    Element root=doc.getDocumentElement();
                    NodeList books=root.getChildNodes(); 
              if(books!=null){
                    for(int i=0;i<books.getLength();i++){
                            Node book=books.item(i);
                            for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling())
                            {
                                 if(node.getNodeType()==Node.ELEMENT_NODE){  
                                        if(node.getNodeName().equals("title")){
                                               String bookname=node.getFirstChild().getNodeValue();
                                                System.out.println(bookname);
                                         } 
                                        if(node.getNodeName().equals("author")){
                                               String author1=node.getFirstChild().getNodeValue();
                                                System.out.println(author1);
                                        }
                                       if(node.getNodeName().equals("description")){
                                              String addtime=node.getFirstChild().getNodeValue();
                                              System.out.println(addtime);
                                       }
                                      if(node.getNodeName().equals("pubDate")){
                                              String price=node.getFirstChild().getNodeValue();
                                              System.out.println(price);
                                      } 
                                }
                          }
                   }
              }
        }catch (ParserConfigurationException e) {
                   e.printStackTrace();
         }catch (FileNotFoundException e) {
                   e.printStackTrace(); 
         }catch (SAXException e) {
                   e.printStackTrace();
         }catch (IOException e) {
                  e.printStackTrace();
         }
    }
    
    public static void main(String[] args) {
               new DOMParsePage();
         }
    }
     
    SAX解析XML
    package simpleTest; 
    import org.xml.sax.Attributes; 
    import org.xml.sax.SAXException; 
    import org.xml.sax.Locator; 
    import org.xml.sax.ContentHandler; 
    import org.xml.sax.InputSource; 
    import org.xml.sax.helpers.DefaultHandler; 
    import java.io.IOException;
    import javax.xml.parsers.SAXParser; 
    import javax.xml.parsers.SAXParserFactory;
    class TestSAX extends DefaultHandler 
    { 
                    private StringBuffer buf;
               public TestSAX() 
              { 
                    super(); 
              } 
              public void setDocumentLocator(Locator locator) 
              { 
              } 
              public void startDocument() throws SAXException 
              { 
                   buf=new StringBuffer(); 
                   System.out.println("*******開始解析文档*******"); 
              } 
              public void endDocument() throws SAXException 
              { 
                  System.out.println("*******文档解析结束*******"); 
               } 
              public void startPrefixMapping( String prefix, String uri ) 
              { 
                  System.out.println("
    前缀映射: " + prefix +" 開始!"+ " 它的URI是:" + uri); 
              } 
              public void endPrefixMapping( String prefix ) 
              {          
                  System.out.println("
    前缀映射: "+prefix+" 结束!"); 
              } 
              public void processingInstruction( String target, String instruction ) throws SAXException { 
               } 
               public void ignorableWhitespace( char[] chars, int start, int length ) throws SAXException 
               { 
               } 
              public void skippedEntity( String name ) throws SAXException 
              { 
              }
             public void startElement(String namespaceURI,String localName,String qName,Attributes atts)
              {  
                     System.out.println("*******開始解析元素*******"); 
                     System.out.println("元素名"+qName); 
                     for(int i=0;i<atts.getLength();i++) 
                     { 
                             System.out.println("元素名"+atts.getLocalName(i)+"属性值"+atts.getValue(i));
                       } 
              }
             public void endElement(String namespaceURI,String localName,String fullName )throws SAXException 
             { 
                     System.out.println("******元素解析结束********"); 
              } 
               public void characters( char[] chars, int start, int length )throws SAXException 
              { 
                     //将元素内容累加到StringBuffer中 
                    buf.append(chars,start,length); 
               }
                public static void main(String args[]) 
              { 
                      try{ 
                              SAXParserFactory sf = SAXParserFactory.newInstance(); 
                              SAXParser sp = sf.newSAXParser(); 
                              TestSAX testsax=new TestSAX(); 
                               sp.parse(new InputSource("D:\test\simpleTest\classes\simpleTest\test.xml"),testsax);
     
                  }catch(IOException e) { 
                               e.printStackTrace(); 
                         }catch(SAXException e) { 
                               e.printStackTrace(); 
                         }catch(Exception e) { 
                               e.printStackTrace(); 
                         } 
             }
    } 

    XML文件例如以下: 
    <?xml version="1.0" encoding="gb2312"?

    > <row> <person> <name>王小明</name> <college>信息学院</college> <telephone>6258113</telephone> <notes>男,1955年生,博士。95年调入海南大学</notes>




  • 相关阅读:
    faster with MyISAM tables than with InnoDB or NDB tables
    w-BIG TABLE 1-toSMALLtable @-toMEMORY
    Indexing and Hashing
    MEMORY Storage Engine MEMORY Tables TEMPORARY TABLE max_heap_table_size
    controlling the variance of request response times and not just worrying about maximizing queries per second
    Variance
    Population Mean
    12.162s 1805.867s
    situations where MyISAM will be faster than InnoDB
    1920.154s 0.309s 30817
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6973756.html
Copyright © 2011-2022 走看看