这篇文章主要为大家展示了“JDK6.0中StAX是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JDK6.0中StAX是什么”这篇文章吧。
StAXJSR 173)是JDK6.0中除了DOM和SAX之外的又一种处理XML文档的API
StAX的来历
在JAXP1.3JSR 206)有两种处理XML文档的方法:DOMDocument Object Model)和SAXSimple API for XML).由于JDK6.0中的JAXB2JSR 222)和JAX-WS 2.0JSR 224)都会用到StAX所以Sun决定把StAX加入到JAXP家族当中来,并将JAXP的版本升级到1.4JAXP1.4是JAXP1.3的维护版本). JDK6里面JAXP的版本就是1.4.
StAX简介
StAX是The Streaming API for XML的缩写,一种利用拉模式解析pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。下面是这几种API的比较转载自http://www.blogjava.net/hsith/archive/2006/06/29/55817.html)
| 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 mainString[] args) throws XMLStreamException, FileNotFoundException {
        readXMLByStAX);//用XMLEventReader解析xml文档
        writeXMLByStAX);//用XMLStreamWriter写xml文档
    }
    private static void readXMLByStAX) throws XMLStreamException, FileNotFoundException {
        XMLInputFactory xmlif = XMLInputFactory.newInstance);
        XMLEventReader xmler = xmlif.createXMLEventReaderStaxTester.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.appendse.getName));
                ifse.getName).getLocalPart).equals"catalog")) {
                    parsingResult.append" id="");
                    parsingResult.appendse.getAttributeByNamenew QName"id")).getValue));
                    parsingResult.append"""); 
                }
                parsingResult.append">");
            } else if event.isCharacters)) { //如果解析的是文本内容
                parsingResult.appendevent.asCharacters).getData));
            } else ifevent.isEndElement)){ //如果解析的是结束标记
                parsingResult.append"                parsingResult.appendevent.asEndElement).getName));
                parsingResult.append">");
            }
        }
        System.out.printlnparsingResult);
    }
    private static void writeXMLByStAX) throws XMLStreamException, FileNotFoundException {
        XMLOutputFactory xmlof = XMLOutputFactory.newInstance);
        XMLStreamWriter xmlw = xmlof.createXMLStreamWriternew 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", "");
        xmlw.writeAttribute"owner","Chinajash");
        xmlw.writeCharacters"n");
        // 写入子元素catalog
        xmlw.writeStartElement"", "catalog");
        xmlw.writeAttribute"id","007");
        xmlw.writeCharacters"Apparel");
        // 写入catalog元素的结束标签
        xmlw.writeEndElement);
        // 写入catalogs元素的结束标签
        xmlw.writeEndElement);
        // 结束 XML 文档        xmlw.writeEndDocument);         
        xmlw.close);
    }
}http://blog.csdn.net/Chinajashhttp://blog.csdn.net/Chinajash
test.xml文件内容如下:
    Book
    Video
运行上面程序后,控制台输出如下:
    Book
    Video
运行上面程序后,产生的output.xml文件如下:
<!– testing comment–>
    Apparel
