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

分享

JDK6的新特性之三:理解StAX

 9loong 2009-04-10
 
JDK6的新特性之三:理解StAX 
StAX(JSR 173)是JDK6.0中除了DOM和SAX之外的又一種處理XML文檔的API

StAX的來歷 

在JAXP1.3(JSR 206)有兩種處理XML文檔的方法:DOM(Document Object Model)和SAX(Simple API for XML).由于JDK6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都會用到StAX所以Sun決定把StAX加入到JAXP家族當中來,并將JAXP的版本升級到1.4(JAXP1.4是JAXP1.3的維護版本). JDK6里面JAXP的版本就是1.4.

StAX簡介

StAX是The Streaming API for XML的縮寫,一種利用拉模式解析(pull-parsing)XML文檔的API.StAX通過提供一種基于事件迭代器(Iterator)的API讓程序員去控制xml文檔解析過程,程序遍歷這個事件迭代器去處理每一個解析事件,解析事件可以看做是程序拉出來的,也就是程序促使解析器產(chǎn)生一個解析事件然后處理該事件,之后又促使解析器產(chǎn)生下一個解析事件,如此循環(huán)直到碰到文檔結(jié)束符;SAX也是基于事件處理xml文檔,但卻是用推模式解析,解析器解析完整個xml文檔后,才產(chǎn)生解析事件,然后推給程序去處理這些事件;DOM采用的方式是將整個xml文檔映射到一顆內(nèi)存樹,這樣就可以很容易地得到父節(jié)點和子結(jié)點以及兄弟節(jié)點的數(shù)據(jù),但如果文檔很大,將會嚴重影響性能。下面是這幾種API的比較(轉(zhuǎn)載自http://www./hsith/archive/2006/06/29/55817.html)

XML Parser API Feature Summary  Feature  StAX  SAX  DOM  TrAX  
API Type  Pull, streaming  Push, streaming  In memory tree  XSLT Rule  
Ease of Use  High  Medium  High  Medium  
XPath Capability  No  No  Yes  Yes  
CPU and Memory Efficiency  Good  Good  Varies  Varies  
Forward Only  Yes  Yes  No  No  
Read XML  Yes  Yes  Yes  Yes  
Write XML  Yes  No  Yes  Yes  
Create, Read, Update, Delete  No  No  Yes  No  


StAX代碼演示

下面代碼演示了如何通過StAX讀取xml文檔和生成xml文檔

public class StaxTester {
    public static void main(String[] args) throws XMLStreamException, FileNotFoundException {
        readXMLByStAX();//用XMLEventReader解析xml文檔
        writeXMLByStAX();//用XMLStreamWriter寫xml文檔
    }

    private static void readXMLByStAX() throws XMLStreamException, FileNotFoundException {
        XMLInputFactory xmlif XMLInputFactory.newInstance();
        XMLEventReader xmler xmlif.createXMLEventReader(StaxTester.class.getResourceAsStream("test.xml"));
        XMLEvent event;
        StringBuffer parsingResult new StringBuffer();
        while (xmler.hasNext()) {
            event xmler.nextEvent();            
            if (event.isStartElement()) //如果解析的是起始標記
                StartElement se event.asStartElement();
                parsingResult.append("<");
                parsingResult.append(se.getName());
                if(se.getName().getLocalPart().equals("catalog")) {
                    parsingResult.append(" id=\"");
                    parsingResult.append(se.getAttributeByName(new QName("id")).getValue());
                    parsingResult.append("\""); 
                }
                parsingResult.append(">");
            else if (event.isCharacters()) //如果解析的是文本內(nèi)容
                parsingResult.append(event.asCharacters().getData());
            else if(event.isEndElement()){ //如果解析的是結(jié)束標記
                parsingResult.append("</");
                parsingResult.append(event.asEndElement().getName());
                parsingResult.append(">");
            }
        }
        System.out.println(parsingResult);
    }

    private static void writeXMLByStAX() throws XMLStreamException, FileNotFoundException {
        XMLOutputFactory xmlof XMLOutputFactory.newInstance();
        XMLStreamWriter xmlw xmlof.createXMLStreamWriter(new FileOutputStream("output.xml"));

        // 寫入默認的 XML 聲明到xml文檔
        xmlw.writeStartDocument();
        xmlw.writeCharacters("\n");
        // 寫入注釋到xml文檔
        xmlw.writeComment("testing comment");
        xmlw.writeCharacters("\n");
        // 寫入一個catalogs根元素
        xmlw.writeStartElement("catalogs");
        xmlw.writeNamespace("myNS", "http://blog.csdn.net/Chinajash");
        xmlw.writeAttribute("owner","Chinajash");
        xmlw.writeCharacters("\n");
        // 寫入子元素catalog
        xmlw.writeStartElement("http://blog.csdn.net/Chinajash", "catalog");
        xmlw.writeAttribute("id","007");
        xmlw.writeCharacters("Apparel");
        // 寫入catalog元素的結(jié)束標簽
        xmlw.writeEndElement();
        // 寫入catalogs元素的結(jié)束標簽
        xmlw.writeEndElement();
        // 結(jié)束 XML 文檔
        xmlw.writeEndDocument();         
        xmlw.close();
    }
}

test.xml文件內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<catalogs>
    <catalog id="001">Book</catalog>
    <catalog id="002">Video</catalog>
</catalogs>

運行上面程序后,控制臺輸出如下:

<catalogs>
    <catalog id="001">Book</catalog>
    <catalog id="002">Video</catalog>
</catalogs>

運行上面程序后,產(chǎn)生的output.xml文件如下:

<?xml version="1.0" ?>
<!-- testing comment-->
<catalogs xmlns:myNS="http://blog.csdn.net/Chinajash" owner="Chinajash">
    <myNS:catalog id="007">Apparel</myNS:catalog>
</catalogs>
 
 

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多