用SAX解析XML的例子

 1. Xml技術簡介
Xml文件有兩種約束類型,包括文檔類型定義(DTD)和Xml 模式(Schema)。Xml DTD被包含在xml1的標準裏。Xml 模式被包含在W3C的標準中。在xml 數據和xml 模式兩者之間有很多的區別。
A. xml模式支持的數據類型比xml DTD多;
B. xml模式在無序的情況下使用起來比xml DTD更方便;
C. xml模式支持名字空間,可以在不同的文件中定義相同的方法等。
D. xml模式形成的文檔可以被多種標準解析,如dom,sax或者jdom等,而xml DTD方式下確不行。
2. Xml文件解析
在java語言環境裏可以使用三種方法解析xml文件:dom(document object model),sax(simple api for xml)和jdom(java document object model)。
SAX提供了基於事件的方式進行解析,適合於快速,數據量小的解析情況。SAX解析有幾個缺陷:A.它的解析是連續的;B.數據無法回朔。
DOM解析不同於SAX。它提供了內存中完整的xml數據映像,數據被存儲在樹狀結構中。DOM解析方式更容易獲得和處理數據。
JDOM是java語言中特有的,主要用來支持xpath標準。
3. SAX解析方式
上面我簡要介紹了幾種解析xml文件的技術,這裏我們使用SAX技術給出一個小例子,大家可以從這個例子中發現如果你能夠掌握一些開源軟件包,你就可以很快掌握解析xml數據的技術。
3.1製作一個簡單的xml文件component.xml
<?xml version="1.0"?>
<XmlComponents>
<XmlComponent>
<ComNo>1</ComNo>
</XmlComponent>
</XmlComponents>

3.2下載xerces.jar軟件包
在Apache網站上×××下載xerces.jar軟件包,這個包中包含了上面我們列舉的幾種解析xml數據的API。然後將這個軟件包加入到程序的classpath中。
3.3製作解析類MySaxParser.java
import java.io.IOException;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

public class MySaxParser extends DefaultHandler {
private static int INDENT = 2;

// 運行主方法
public static void main(String[] argv) {
// if (argv.length != 1) {
// System.out.println("Usage: java ds.MySaxParser [URI]");
// System.exit(0);
// }
System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");
// String uri = argv[0];
String uri = "Components.xml";
try {
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
parserFactory.setValidating(false);
parserFactory.setNamespaceAware(false);
MySaxParser MySaxParserInstance = new MySaxParser();
SAXParser parser = parserFactory.newSAXParser();
parser.parse(uri, MySaxParserInstance);
}
catch(IOException ex) {
ex.printStackTrace();
}
catch(SAXException ex) {
ex.printStackTrace();
}
catch(ParserConfigurationException ex) {
ex.printStackTrace();
}
catch(FactoryConfigurationError ex) {
ex.printStackTrace();
}

}

private int idx = 0; //indent
// 處理各種分隔符號
public void characters(char[] ch, int start, int length) throws SAXException {
//instantiates s, indents output, prints character values in element
String s = new String(ch, start, length);
if (!s.startsWith("/n")) //空的value不打印
System.out.println(getIndent()+ " Value: " + s);
}

// 處理文檔尾
public void endDocument() throws SAXException {
idx -= INDENT;
System.out.println(getIndent() + "end document");

System.out.println("...PARSING ends");
}

// 處理標記尾
public void endElement(String uri, String localName, String qName) throws SAXException {
idx -= INDENT;
}

// 處理文檔的起始點
public void startDocument() throws SAXException {
idx += INDENT;
System.out.println("PARSING begins...");
System.out.println(getIndent() + "start document: ");
}

// 處理標記頭
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
idx += INDENT;
System.out.println('/n' + getIndent() + "start element: " + qName);

}

private String getIndent() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < idx; i++)
sb.append(" ");
return sb.toString();
}

}


總結,雖然解析xml數據很複雜,因爲涉及了很多的遞歸算法,但是我們可以使用業界比較成熟的解析API來進行xml數據處理。我現在只是給出了一個非常簡單的例子,但是在真實系統中遠比這個要複雜的多,大家以後在使用的使用會發現還是有很多的工作要做的。
發佈了12 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章