因此, 在处理规模较大的XML文档时就非常耗内存,占用资源较多。
尤其是仅仅须要操作文档中一小部分时效率非常低。
因此,SAX相对于DOM来说更适合操作大文档。
SAX从文档的開始通过每一节点移动。以定位一个特定的节点。 DOM为加载到内存的文档节点建立类型描写叙述。终于,这些描写叙述呈现了可easy横向移动、潜
假设XML非常冗长,DOM就会显示出无法控制的胀 大。比如,一个300KB的XML文档能够导致RAM或者虚拟内存中的3。000。000KB的DOM树型结构。
通过比較就会发现。
在某些情况下。在一个方案中,最佳的选择是使用DOM和SAX处理不同的部分。比如,你能够使用DOM将XML加载到内存并改变它,然后通过从DOM树中发送一个SAX流而转移最后的结果。
实际上。它是一种社区性质的讨论产物。尽管如此,在XML中对SAX的应用丝毫不比DOM少。差点儿全部的XML解析器都会支持它。
我们知道,在处理DOM的时候。我们须要读入整个的XML文档,然后在内存中创建DOM树,生成 DOM树上的每一个Node对象。当文档比較小的时候,这不会造成什么问题,可是一旦文档大起来,处理DOM就会变得相当费时费力。
特别是其对于内存的需 求,也将是成倍的增长,以至于在某些应用中使用DOM是一件非常不划算的事(比方在applet中)。这时候,一个较好的替代解决方法就是SAX。
首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不须要读入整个文档,而文档的读入过程也就是 SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序执行方法。(假设你对Java新的代理事件模型比較清楚的话,就会非常容 易理解这样的机制了)
解析開始之前,须要向XMLReader注冊一个ContentHandler,也就是相当于一个事件监听器,在ContentHandler中定义 了非常多方法。比方startDocument(),它定制了当在解析过程中,遇到文档開始时应该处理的事情。
当XMLReader读到合适的内容。就会抛 出对应的事件。并把这个事件的处理权代理给ContentHandler。调用其对应的方法进行响应
dom解析xmlimport 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
SAX解析XMLpackage 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
XML文件例如以下:
> <row> <person> <name>王小明</name> <college>信息学院</college> <telephone>6258113</telephone> <notes>男,1955年生,博士。95年调入海南大学</notes>