小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多