天天看點

java怎麼xml檔案解析_Java對Xml檔案解析

JAVA 解析 XML 通常有兩種方式,DOM 和 SAX。

DOM 雖然是 W3C 的标準,提供了标準的解析方式,但它的解析效率一直不盡如人意,因為使用DOM解析XML時,解析器讀入整個文檔并建構一個駐留記憶體的樹結構(節點樹),然後您的代碼才可以使用 DOM 的标準接口來操作這個樹結構。但大部分情況下我們隻對文檔的部分内容感興趣,根本就不用先解析整個文檔,并且從節點樹的根節點來索引一些我們需要的資料也是非常耗時的。

SAX是一種XML解析的替代方法。相比于文檔對象模型DOM,SAX 是讀取和操作 XML 資料的更快速、更輕量的方

法。SAX 允許您在讀取文檔時處理它,進而不必等待整個文檔被存儲之後才采取操作。它不涉及 DOM 所必需的開銷和概念跳躍。 SAX API是一個基于事件的API ,适用于處理資料流,即随着資料的流動而依次處理資料。SAX API 在其解析您的文檔時發生一定事件的時候會通知您。在您對其響應時,您不作儲存的資料将會 被抛棄。

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

1

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資料處理。我現在隻是給出了一個非常簡單的例子,但是在真實系統中遠比這個要複雜的多,大家以後在使用的使用會發現還是有很多的工作要做的。