开篇博客,写个简单点的。。。。就写下xml的解析吧
我们所常见的用java解析xml的方式有两种——SAX方式和DOM方式,这两种方式的特点分别如下:
SAX方式:SAX处理器会从头到尾将xml文档扫描一遍,每当处理器遇到一个语法结构时,它就会调用这个特定语法结构的事件处理程序向应用程序发送一个事件。相关的语法结构会自动包括开始标签、属性、文本和结束标签。它的优点是,分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
DOM方式:DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
DOM相对于SAX的优势有:1.当文档的某一部分需要被应用程序多次访问时,DOM表示具有明显的优势;2.当应用程序需要对文档进行调整时,如果能一次性的访问整个文档,显然要快点;3.DOM方式可以随机访问文档中的某个部分;4.由于解析器在进行处理之前能看到整个文档,因此这种方式可以根据相应的DTD或XML架构的规定来避免无效操作。
SAX方式相对于DOM的优点在于,DOM结构时完全存储在内存中的,若文档比较大,则很占用内存,而且xml文档的大小没有限制,所以有些文档就不能用DOM方式解析,而SAX不存在这样的问题。
下面上两段代码,分别使用两种方式解析一段xml
xml文件:test.xml
<?xml version="1.0" encoding="UTF-8"?> <result> <person> <name>frank</name> <addr>shaanxi xi'an software park</addr> </person> <person> <name>michael</name> <addr>shaanxi xi'an keji road</addr> </person> </result>
使用Dom方式解析上面的test.xml
1 import java.io.*; 2 import java.util.*; 3 import org.w3c.dom.*; 4 import javax.xml.parsers.*; 5 6 public class DomXML { 7 public static void main(String args[]) { 8 try { 9 File file = new File("test.xml"); 10 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 11 DocumentBuilder builder = factory.newDocumentBuilder(); 12 Document doc = builder.parse(file); 13 NodeList nl = doc.getElementsByTagName("person"); 14 for (int i = 0; i < nl.getLength(); i++) { 15 System.out.println("name: " + 16 doc.getElementsByTagName("name").item(i).getFirstChild().getNodeValue()); 17 System.out.println("address: " + 18 doc.getElementsByTagName("addr").item(i).getFirstChild().getNodeValue()); 19 } 20 } catch (Exception e) { 21 e.printStackTrace(); 22 } 23 } 24 }
1 import org.xml.sax.*; 2 import org.xml.sax.helpers.*; 3 import javax.xml.parsers.*; 4 5 public class SaxXML extends DefaultHandler { 6 7 java.util.Stack tags = new java.util.Stack(); 8 9 public SaxXML() { 10 super(); 11 } 12 13 public static void main(String[] args) { 14 try { 15 SAXParserFactory sf = SAXParserFactory.newInstance(); 16 SAXParser sp = sf.newSAXParser(); 17 SaxXML saxXml = new SaxXML(); 18 sp.parse(new InputSource("test.xml"), saxXml); 19 } catch(Exception e) { 20 e.printStackTrace(); 21 } 22 } 23 24 public void characters(char ch[], int start, int length) throws SAXException { 25 String tag = (String) tags.peek(); 26 if (tag.equals("name")) { 27 System.out.println("name: " + new String(ch, start, length)); 28 } 29 30 if (tag.equals("addr")) { 31 System.out.println("address: " + new String(ch, start, length)); 32 } 33 } 34 35 public void startElement(String uri, String localName, String qName, Attributes attrs) { 36 tags.push(qName); 37 } 38 39 }