package com.jelly.xml; import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; /** * SAX解析XML * @author Jelly * QQ:136179492 * */ public class SaxTest { /** * @param args * @throws SAXException * @throws Exception */ public static void main(String[] args) throws Exception{ //step 1:获得SAX解析工厂实例 SAXParserFactory factory = SAXParserFactory.newInstance(); //step 2:获得SAX解析实例 SAXParser saxParser = factory.newSAXParser(); //step 3:开始解析 saxParser.parse(new File("Test.xml"), new SaxTest2()); } }
package com.jelly.xml; import java.util.Stack; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * SAX解析XML Handler类 * @author Jelly * */ public class SaxTest2 extends DefaultHandler{ public Stack<String> stack = new Stack<String>(); private String name; private String address; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { stack.push(qName); for (int i = 0; i <attributes.getLength(); i++) { String name = attributes.getQName(i); String value = attributes.getValue(i); System.out.println(name+"===="+value); } } public void endElement(String uri, String localName, String qName) throws SAXException { stack.pop(); if("person".equals(qName)){ System.out.println("姓名:"+this.name); System.out.println("地址:"+this.address); } } public void characters(char[] ch, int start, int length) throws SAXException { String tag = stack.peek(); if(tag.equals("name")){ name = new String(ch,start,length); this.name = name; } if(tag.equals("address")){ this.address = new String(ch,start,length); } } }
<?xml version="1.0" encoding="UTF-8"?> <people> <person personId="s01"> <name>jelly</name> <address>wufsfsfsfssf</address> </person> <person personId="s02"> <name>jelly2</name> <address>chengdu</address> </person> </people>
Dom:
DOM 是处理 XML 数据的传统方法。使用 DOM 时,数据以树状结构的形式被加载到内存中。DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。
另一方面,在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并不鲜见。此外,创建一棵 DOM 树可能是一个缓慢的过程。
SAX:
SAX 处理涉及以下步骤:
1.创建一个事件处理程序。
2.创建 SAX 解析器。
3.向解析器分配事件处理程序。
4.解析文档,同时向事件处理程序发送每个事件。
这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。
另一方面,由于应用程序没有以任何方式存储数据,使用 SAX 来更改数据或在数据流中往后移是不可能的。
选择 DOM 还是选择 SAX,这取决于下面几个因素:
1.应用程序的目的:如果打算对数据作出更改并将它输出为 XML,那么在大多数情况下,DOM 是适当的选择。并不是说使用 SAX 就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。
2.数据容量: 对于大型文件,SAX 是更好的选择。
数据将如何使用:如果只有数据中的少量部分会被使用,那么使用 SAX 来将该部分数据提取到应用程序中可能更好。 另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么 SAX 也许不是恰当的选择。
3.对速度的需要: SAX 实现通常要比 DOM 实现更快。
SAX 和 DOM 不是相互排斥的,记住这点很重要。您可以使用 DOM 来创建 SAX 事件流,也可以使用 SAX 来创建 DOM 树。事实上,用于创建 DOM 树的大多数解析器实际上都使用 SAX 来完成这个任务!