java怎么xml文件解析_Java对Xml文件解析
JAVA 解析 XML 通常有兩種方式,DOM 和 SAX。
DOM 雖然是 W3C 的標(biāo)準(zhǔn),提供了標(biāo)準(zhǔn)的解析方式,但它的解析效率一直不盡如人意,因?yàn)槭褂肈OM解析XML時,解析器讀入整個文檔并構(gòu)建一個駐留內(nèi)存的樹結(jié)構(gòu)(節(jié)點(diǎn)樹),然后您的代碼才可以使用 DOM 的標(biāo)準(zhǔn)接口來操作這個樹結(jié)構(gòu)。但大部分情況下我們只對文檔的部分內(nèi)容感興趣,根本就不用先解析整個文檔,并且從節(jié)點(diǎn)樹的根節(jié)點(diǎn)來索引一些我們需要的數(shù)據(jù)也是非常耗時的。
SAX是一種XML解析的替代方法。相比于文檔對象模型DOM,SAX 是讀取和操作 XML 數(shù)據(jù)的更快速、更輕量的方
法。SAX 允許您在讀取文檔時處理它,從而不必等待整個文檔被存儲之后才采取操作。它不涉及 DOM 所必需的開銷和概念跳躍。 SAX API是一個基于事件的API ,適用于處理數(shù)據(jù)流,即隨著數(shù)據(jù)的流動而依次處理數(shù)據(jù)。SAX API 在其解析您的文檔時發(fā)生一定事件的時候會通知您。在您對其響應(yīng)時,您不作保存的數(shù)據(jù)將會 被拋棄。
1. Xml技術(shù)簡介Xml文件有兩種約束類型,包括文檔類型定義(DTD)和Xml 模式(Schema)。Xml DTD被包含在xml1的標(biāo)準(zhǔn)里。Xml 模式被包含在W3C的標(biāo)準(zhǔn)中。在xml 數(shù)據(jù)和xml 模式兩者之間有很多的區(qū)別。
A. xml模式支持的數(shù)據(jù)類型比xml DTD多;
B. xml模式在無序的情況下使用起來比xml DTD更方便;
C. xml模式支持名字空間,可以在不同的文件中定義相同的方法等。
D. xml模式形成的文檔可以被多種標(biāo)準(zhǔn)解析,如dom,sax或者jdom等,而xml DTD方式下確不行。
2. Xml文件解析
在java語言環(huán)境里可以使用三種方法解析xml文件:dom(document object model),sax(simple api for xml)和jdom(java document object model)。
SAX提供了基于事件的方式進(jìn)行解析,適合于快速,數(shù)據(jù)量小的解析情況。SAX解析有幾個缺陷:A.它的解析是連續(xù)的;B.數(shù)據(jù)無法回朔。
DOM解析不同于SAX。它提供了內(nèi)存中完整的xml數(shù)據(jù)映像,數(shù)據(jù)被存儲在樹狀結(jié)構(gòu)中。DOM解析方式更容易獲得和處理數(shù)據(jù)。
JDOM是java語言中特有的,主要用來支持xpath標(biāo)準(zhǔn)。
3. SAX解析方式
上面我簡要介紹了幾種解析xml文件的技術(shù),這里我們使用SAX技術(shù)給出一個小例子,大家可以從這個例子中發(fā)現(xiàn)如果你能夠掌握一些開源軟件包,你就可以很快掌握解析xml數(shù)據(jù)的技術(shù)。
3.1制作一個簡單的xml文件component.xml
1
3.2下載xerces.jar軟件包
在Apache網(wǎng)站上×××下載xerces.jar軟件包,這個包中包含了上面我們列舉的幾種解析xml數(shù)據(jù)的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;
// 運(yùn)行主方法
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");
}
// 處理標(biāo)記尾
public void endElement(String uri, String localName, String qName) throws SAXException {
idx -= INDENT;
}
// 處理文檔的起始點(diǎn)
public void startDocument() throws SAXException {
idx += INDENT;
System.out.println("PARSING begins...");
System.out.println(getIndent() + "start document: ");
}
// 處理標(biāo)記頭
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();
}
} 總結(jié),雖然解析xml數(shù)據(jù)很復(fù)雜,因?yàn)樯婕傲撕芏嗟倪f歸算法,但是我們可以使用業(yè)界比較成熟的解析API來進(jìn)行xml數(shù)據(jù)處理。我現(xiàn)在只是給出了一個非常簡單的例子,但是在真實(shí)系統(tǒng)中遠(yuǎn)比這個要復(fù)雜的多,大家以后在使用的使用會發(fā)現(xiàn)還是有很多的工作要做的。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的java怎么xml文件解析_Java对Xml文件解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置管理和Java开发_Java开发环境
- 下一篇: java mvc模式工作流程_Sprin