日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

JAXP(Java API for XML Parsing)

 芳草小集 2006-03-24
 

JAXP(Java API for XML Parsing) 

 

過去幾年中,XML分折已經(jīng)被標(biāo)準(zhǔn)為兩個不同的處理模型:SAX(Simple API for XML)以及DOM(Document Object Model)。這兩個標(biāo)準(zhǔn)提供了各種API以便開發(fā)人員處理XML數(shù)據(jù),分別適用於不同的分折需要。JAXPSUN公司在1999年後期提出的,它是一個API,但更準(zhǔn)確地說,它應(yīng)該是一個抽象層。JAXP並不提供解折功能!沒有SAXDOM或其它XML解折API,我們無法解折XML 

一、SAX(Simple API for XML)

SAX是基於事件的處理模型,在此模型中,解折程序按序列順序解釋數(shù)據(jù)元素,同時基於所選擇的結(jié)構(gòu)回調(diào)函數(shù)。它最大的優(yōu)點是:它並不把任何XML文檔裝載進(jìn)內(nèi)存,因此被認(rèn)為是非常迅速和輕便的。它使用一個序列只讀的方法,並不支持對XML元素的隨機(jī)訪問。 

基本實現(xiàn)由以下三個驟組成

1、實現(xiàn)一個擴(kuò)展DefaultHandler的類,並為每種類型的結(jié)構(gòu)包含回調(diào)方法。

2、初始化一個新的SAXParser類。Parser讀到XML源文件,並觸發(fā)DefaultHandler類中所實現(xiàn)的一個回調(diào)方法

3、須序讀取XML源文件。在須序讀取中,無法隨機(jī)訪問結(jié)構(gòu)中的元素。剩下的工作取決於Handler類中你的實現(xiàn)方案。 

示例

書寫一個用於讀取的XML文檔test.xml,具體內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>

<simple date="21/2/2006">

        <name>wang</name>

        <location>China DongGuan</location>

</simple>

 

實現(xiàn)一個擴(kuò)展DefaultHandler的類SaxTestHandler.java代碼如下

package mypack;

 

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

 

public class SaxTestHandler extends DefaultHandler {

 

        // 重載DefaultHandler類的方法

        // 以攔截SAX事件通知。

        //     

 

        /* 開始解折文析進(jìn)執(zhí)行 */

        public void startDocument() throws SAXException {

                System.out.println("SAX Event: START DOCUMENT");

        }

 

        /* 結(jié)束解折時執(zhí)行 */

        public void endDocument() throws SAXException {

                System.out.println("SAX Event: END DOCUMENT");

        }

 

        /* 遇到一個節(jié)點時執(zhí)行 */

        public void startElement(String namespaceURI, String localName,

                        String qName, Attributes attr) throws SAXException {

                System.out.println("SAX Event: START ELEMENT[ " + localName + " ]");

                // System.out.println(namespaceURI+";;;"+qName);

 

                // 如果有屬性,打印屬性和屬性值

                for (int i = 0; i < attr.getLength(); i++) {

                        System.out.println(" ATTRIBUTE: " + attr.getLocalName(i)

                                        + " VALUE: " + attr.getValue(i));

                }

        }

 

        // 元素數(shù)據(jù)

        public void characters(char[] ch, int start, int length)

                        throws SAXException {

                String s = new String(ch, start, length);

                System.out.println(s);

        }

}

 

這個類實現(xiàn)了內(nèi)容處理接口的實現(xiàn),該實現(xiàn)只做了一個簡單的處理:把有關(guān)XML文檔的內(nèi)容打印到系統(tǒng)控制臺。

 

一個SAXParser類,用於指定解折器並讀取XML文檔然後調(diào)用Handler類的回調(diào)方法。代碼如下:

package mypack;

 

import java.io.FileReader;

 

import org.xml.sax.InputSource;

import org.xml.sax.XMLReader;

import org.xml.sax.helpers.XMLReaderFactory;

 

public class SAXTest {

 

        /**

         * @param args

         */

        public static void main(String[] args) {

                // TODO 自動產(chǎn)生方法

                try {

                        // 建立SAX2解折器

                        XMLReader xr = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");

 

                        // 安裝ContentHandler內(nèi)容處理類

                        SaxTestHandler handler=new SaxTestHandler();

                        xr.setContentHandler( handler );

 

                        // 解折文檔

                        xr.parse(new InputSource(new FileReader("D:\\MyProject\\Ewebsite\\XML\\JavaSource\\test.xml")));

                } catch (Exception e) {

                        e.printStackTrace();

                }

        }

}

 

執(zhí)行SAXTest可以打印出test.xml文件的內(nèi)容(節(jié)點名,節(jié)點的屬性及值,元素內(nèi)容)

 

二、DOM(Document Object Model)

XML將數(shù)據(jù)組織為一棵樹,所以DOM就是對這棵樹的一個對象描敘。通俗的說,就是通過解折XML文檔,為XML文檔在邏輯上建立一個樹模型,樹的節(jié)點就是一個個對象。我們通過存到這些對象就能夠存取XML文檔的內(nèi)容。當(dāng)XML文檔很大時,這個過程可能需要一塊相當(dāng)大的內(nèi)存,這可能出現(xiàn)內(nèi)存不足的現(xiàn)象。

 

使用DOM處理的基本步驟如下:

1、實例一個DOMParser。

2、得到一個Document對象。

3、使用Document對象訪問代表了XML文檔中元素的節(jié)點。

 

XML源被完全讀入內(nèi)存,並用Document對象表示。這就使得應(yīng)用程序能夠隨機(jī)訪問任何節(jié)點,這一點也是SAX所不能做到的。

 

一個讀取XML文檔的DOM處理示例

package mypack;

 

import java.io.FileReader;

import java.io.IOException;

 

import javax.xml.parsers.ParserConfigurationException;

 

import org.apache.xerces.parsers.DOMParser;//導(dǎo)入DOMParser解折器

import org.w3c.dom.Document;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.InputSource;

import org.xml.sax.SAXException;

 

public class DOMTest {

 

        /**

         * @param args

         * @throws ParserConfigurationException

         * @throws IOException

         * @throws SAXException

         */

        public static void main(String[] args) throws ParserConfigurationException,

                        SAXException, IOException {

                // TODO 自動產(chǎn)生方法 Stub

 

                // 實例解折器

                DOMParser parser = new DOMParser();

                // Docment對象的形式獲取DOM

                parser.parse(new InputSource(new FileReader(

                                "D:\\MyProject\\Ewebsite\\XML\\JavaSource\\test.xml")));

                Document doc = parser.getDocument();

                // 使用Document對象的方法得到NodeList對象

                NodeList nl = doc.getElementsByTagName("name");

                System.out.println(nl.getLength());// 標(biāo)簽的次數(shù)

                Node my_node = nl.item(0);

                // 輸出name標(biāo)簽的元素數(shù)據(jù)

                String name = my_node.getFirstChild().getNodeValue();

                System.out.println(name);

        }

}

 

現(xiàn)在,既然我們已經(jīng)能夠從XML文件中提取出數(shù)據(jù)了,我們就可以把這些數(shù)據(jù)用在合適的地方,來構(gòu)筑應(yīng)用程序。

 

DOM對象詳解

1.基本的DOM對象

DOM
的基本對象有5個:Document,Node,NodeListElementAttr。下面就這些對象的功能和實現(xiàn)的方法作一個大致的介紹。

Document
對象代表了整個XML的文檔,所有其它的Node,都以一定的順序包含在Document對象之內(nèi),排列成一個樹形的結(jié)構(gòu),程序員可以通過遍歷這顆樹來得到XML文檔的所有的內(nèi)容,這也是對XML文檔操作的起點。我們總是先通過解析XML源文件而得到一個Document對象,然后再來執(zhí)行后續(xù)的操作。此外,Document還包含了創(chuàng)建其它節(jié)點的方法,比如createAttribut()用來創(chuàng)建一個Attr對象。它所包含的主要的方法有:

createAttribute(String)
:用給定的屬性名創(chuàng)建一個Attr對象,并可在其后使用setAttributeNode方法來放置在某一個Element對象上面。

createElement(String):用給定的標(biāo)簽名創(chuàng)建一個Element對象,代表XML文檔中的一個標(biāo)簽,然后就可以在這個Element對象上添加屬性或進(jìn)行其它的操作。

createTextNode(String)
:用給定的字符串創(chuàng)建一個Text對象,Text對象代表了標(biāo)簽或者屬性中所包含的純文本字符串。如果在一個標(biāo)簽內(nèi)沒有其它的標(biāo)簽,那么標(biāo)簽內(nèi)的文本所代表的Text對象是這個Element對象的唯一子對象。

getElementsByTagName(String):返回一個NodeList對象,它包含了所有給定標(biāo)簽名字的標(biāo)簽。

getDocumentElement()
:返回一個代表這個DOM樹的根節(jié)點的Element對象,也就是代表XML文檔根元素的那個對象。

Node對象是DOM結(jié)構(gòu)中最為基本的對象,代表了文檔樹中的一個抽象的節(jié)點。在實際使用的時候,很少會真正的用到Node這個對象,而是用到諸如Element、Attr、TextNode對象的子對象來操作文檔。Node對象為這些對象提供了一個抽象的、公共的根。雖然在Node對象中定義了對其子節(jié)點進(jìn)行存取的方法,但是有一些Node子對象,比如Text對象,它并不存在子節(jié)點,這一點是要注意的。Node對象所包含的主要的方法有:

appendChild(org.w3c.dom.Node)
:為這個節(jié)點添加一個子節(jié)點,并放在所有子節(jié)點的最后,如果這個子節(jié)點已經(jīng)存在,則先把它刪掉再添加進(jìn)去。

getFirstChild():如果節(jié)點存在子節(jié)點,則返回第一個子節(jié)點,對等的,還有getLastChild()方法返回最后一個子節(jié)點。

getNextSibling()
:返回在DOM樹中這個節(jié)點的下一個兄弟節(jié)點,對等的,還有getPreviousSibling()方法返回其前一個兄弟節(jié)點。

getNodeName():根據(jù)節(jié)點的類型返回節(jié)點的名稱。

getNodeType():返回節(jié)點的類型。

getNodeValue()
:返回節(jié)點的值。

hasChildNodes()
:判斷是不是存在有子節(jié)點。

hasAttributes()
:判斷這個節(jié)點是否存在有屬性。

getOwnerDocument()
:返回節(jié)點所處的Document對象。

insertBefore(org.w3c.dom.Node new
org.w3c.dom.Node ref):在給定的一個子對象前再插入一個子對象。

removeChild(org.w3c.dom.Node)
:刪除給定的子節(jié)點對象。

replaceChild(org.w3c.dom.Node new
org.w3c.dom.Node old):用一個新的Node對象代替給定的子節(jié)點對象。

NodeList對象,顧名思義,就是代表了一個包含了一個或者多個Node的列表??梢院唵蔚陌阉闯梢粋€Node的數(shù)組,我們可以通過方法來獲得列表中的元素:

GetLength()
:返回列表的長度。

Item(int):返回指定位置的Node對象。

Element
對象代表的是XML文檔中的標(biāo)簽元素,繼承于Node,亦是Node的最主要的子對象。在標(biāo)簽中可以包含有屬性,因而Element對象中有存取其屬性的方法,而任何Node中定義的方法,也可以用在Element對象上面。

getElementsByTagName(String)
:返回一個NodeList對象,它包含了在這個標(biāo)簽中其下的子孫節(jié)點中具有給定標(biāo)簽名字的標(biāo)簽。

getTagName()
:返回一個代表這個標(biāo)簽名字的字符串。

getAttribute(String)
:返回標(biāo)簽中給定屬性名稱的屬性的值。在這兒需要主要的是,應(yīng)為XML文檔中允許有實體屬性出現(xiàn),而這個方法對這些實體屬性并不適用。這時候需要用到getAttributeNodes()方法來得到一個Attr對象來進(jìn)行進(jìn)一步的操作。

getAttributeNode(String):返回一個代表給定屬性名稱的Attr對象。

Attr
對象代表了某個標(biāo)簽中的屬性。Attr繼承于Node,但是因為Attr實際上是包含在Element中的,它并不能被看作是Element的子對象,因而在DOMAttr并不是DOM樹的一部分,所以Node中的getparentNode(),getpreviousSibling()getnextSibling()返回的都將是null也就是說,Attr其實是被看作包含它的Element對象的一部分,它并不作為DOM樹中單獨的一個節(jié)點出現(xiàn)。這一點在使用的時候要同其它的Node子對象相區(qū)別。

需要說明的是,上面所說的DOM對象在DOM中都是用接口定義的, DOM其實可以在任何面向?qū)ο蟮恼Z言中實現(xiàn),只要它實現(xiàn)了DOM所定義的接口和功能就可以了。

 

三、JAXP

1、用SAX處理XML

下面是JAXP的操作示范

(1)   創(chuàng)建已實現(xiàn)的Handler類的實例。

(2)   利用SAXParserFactory的靜態(tài)方法newInstance()方法獲取一個factory類。

(3)   通過newSAXParser()靜態(tài)方法從factory中獲取SAX分折器。

(4)   分折XML數(shù)據(jù):調(diào)用SAXParser的分折方法,把XML輸入作為第一個參數(shù),而Handler實現(xiàn)方案作為第二個參數(shù)。

 

 

示例代碼如下:

package mypack;

 

import java.io.IOException;

 

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

 

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

 

public class JaxpSaxTest {

        /**

         * @param args

         * @throws SAXException

         * @throws ParserConfigurationException

         * @throws IOException

         */

        public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

                // TODO 自動產(chǎn)生方法 Stub

                //實例一個內(nèi)容處理類

                DefaultHandler handler=new SaxTestHandler();

                //得到廠類

                SAXParserFactory factory=SAXParserFactory.newInstance();

                //在廠類中獲取SAX分折器

                SAXParser parser=factory.newSAXParser();

                //分折XML數(shù)據(jù)

                parser.parse("D:\\MyProject\\Ewebsite\\XML\\JavaSource\\test.xml",handler);

        }

}

 

2、用DOM處理

 

步聚如下:

(1)初始化一個新的Builder類。Builder類負(fù)責(zé)讀取XML數(shù)據(jù)並把XML數(shù)據(jù)轉(zhuǎn)化為樹狀表示。

(2)一旦數(shù)據(jù)轉(zhuǎn)化完成,即創(chuàng)建Document對象。一旦對象創(chuàng)建後,以後所有的對XML文檔的操作都與解折器無關(guān)了。

(3) 使用Document對象訪問代表了XML文檔中元素的節(jié)點。

 

示例代碼如下:

package mypack;

 

import java.io.IOException;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

 

import org.w3c.dom.Document;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

 

public class JaxpDomTest {

        /**

         * @param args

         * @throws ParserConfigurationException

         * @throws IOException

         * @throws SAXException

         */

        public static void main(String[] args) throws ParserConfigurationException,

                        SAXException, IOException {

                // TODO 自動產(chǎn)生方法 Stub

 

                // 實例一個Builder,DocumentBuilder的目的是為了創(chuàng)建與具體解折器無關(guān)的程序

                // 廠類的靜態(tài)方法newInstance()被調(diào)用時,它根據(jù)一個系統(tǒng)變量來決定具體使用哪一個解折器。

                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

                DocumentBuilder builder = factory.newDocumentBuilder();

 

                // 創(chuàng)建Document對象

                Document document = builder

                                .parse("D:\\MyProject\\Ewebsite\\XML\\JavaSource\\test.xml");

 

                // 使用Document對象的方法得到NodeList對象

                NodeList nl = document.getElementsByTagName("name");

                System.out.println(nl.getLength());// 標(biāo)簽的次數(shù)

                Node my_node = nl.item(0);

                // 輸出name標(biāo)簽的元素數(shù)據(jù)

                String name = my_node.getFirstChild().getNodeValue();

                System.out.println(name);

        }

 

}

 

 

 

 

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多