DOM解析器把XML文檔轉化為一個包含其內容的樹,並可以對樹進行遍歷。用DOM解析模型的優點是編程容易,開發人員只需要調用建樹的指令,然後利用navigation APIs訪問所需的樹節點來完成任務。可以很容易的添加和修改樹中的元素。然而由於使用DOM解析器的時候需要處理整個XML文檔,所以對性能和內存的要求比較高,尤其是遇到很大的XML文件的時候。由於它的遍歷能力,DOM解析器常用於XML文檔需要頻繁的改變的服務中。
例: import Java.io.*;import java.util.*;import org.w3c.dom.*;import Javax.XML.parsers.*;
public class MyXMLReader{
public static void main(String arge[]){
long lasting =System.currentTimeMillis();
try{
File f=new File("data_10k.XML");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("VALUE");
for (int i=0;i<nl.getLength();i++){
System.out.print("車牌號碼:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
System.out.println("車主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
}
}catch(Exception e){
e.printStackTrace();
}
SAX解析器采用了基於事件的模型,它在解析XML文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以激活一個回調方法,告訴該方法制定的標簽已經找到。SAX對內存的要求通常會比較低,因為它讓開發人員自己來決定所要處理的tag。特別是當開發人員只需要處理文檔中所包含的部分數據時,SAX這種擴展能力得到了更好的體現。但用SAX解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文檔中的多處不同數據。
例: import org.xml.sax.*;import org.XML.sax.helpers.*;import Javax.XML.parsers.*;
public class MyXMLReader extends DefaultHandler {
java.util.Stack tags = new Java.util.Stack();
public MyXMLReader() {
super();}
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.XML"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("運行時間:" + (System.currentTimeMillis() - lasting) + "毫秒");}
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
if (tag.equals("NO")) {
System.out.print("車牌號碼:" + new String(ch, start, length));}if (tag.equals("ADDR")) {
System.out.println("地址:" + new String(ch, start, length));}}
public void startElement(String uri,String localName,String qName,Attributes attrs) {
tags.push(qName);}}
注意:當xml數據的形式作為傳遞時,要獲取一條條的紀錄是比較適宜於采用dom,雖然它對系統(內存,性能等)有較高的要求,但是一般的服務器都可滿足上G的XML文檔的處理。
當需要對xml的某些內容或某些節點的特定訪問時,或需要一及時地事件相應時,可以用sax來處理。它是基於時間處理機制的,在編程時,通過重載一些事件方法,來獲得對XML文檔的處理。
有關xml的編碼,InputStreamReader和XMLReader的關系:
通常的DOM和SAX對於用ascii編碼的文檔,通過用InputStreamReader讀入xml文檔,後變成了unicode碼,然後不能用 XMLREader來處理,出現錯誤的原因是:遇到無效的unicode的字符。(當你用system.out.println()輸出是沒有任何問題,因為它能自動轉成本地機的編碼)。
解決的方法:
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f),"ISO8859-1"));
這樣就可以限定它的編碼,這樣就沒有問題。
String 的長度問題:String 類型安標准來說沒有長度限制,但是一般jdk中String的最大長度是4G。
String與BufferedString關系:在不涉及到字符串有效的大量處理,通常使用String. BufferedString在處理字符串的大量處理上有優勢