因此, 在处理规模较大的XML文档时就非常耗内存,占用资源较多。
尤其是仅仅须要操作文档中一小部分时效率非常低。
因此,SAX相对于DOM来说更适合操作大文档。
DOM是复杂对象处理的首选,比方当XML比較复杂的时候,或者当你须要随机处理文档中数据的时候。
SAX从文档的開始通过每一节点移动。以定位一个特定的节点。 DOM为加载到内存的文档节点建立类型描写叙述。终于,这些描写叙述呈现了可easy横向移动、潜
假设XML非常冗长,DOM就会显示出无法控制的胀 大。比如,一个300KB的XML文档能够导致RAM或者虚拟内存中的3。000。000KB的DOM树型结构。
通过比較就会发现。
在某些情况下。在一个方案中,最佳的选择是使用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("\n前缀映射: " + prefix +" 開始!"+ " 它的URI是:" + uri); } public void endPrefixMapping( String prefix ) { System.out.println("\n前缀映射: "+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"?