Java核心技术·卷Ⅱ:高级特性(原书第10版)
上QQ阅读APP看书,第一时间看更新

3.7.5 使用StAX写出XML文档

在前一节中,你看到了如何通过写出DOM树的方法来产生XML文件。如果这个DOM树没有其他任何用途,那么这种方式就不是很高效。

StAX API使我们可以直接将XML树写出,这需要从某个OutputStream中构建一个XMLStreamWriter,就像下面这样:

要产生XML文件头,需要调用

然后调用

添加属性需要调用

现在,可以通过再次调用writeStartElement添加新的子节点,或者用下面的调用写出字符:

在写完所有子节点之后,调用

这会导致当前元素被关闭。

要写出没有子节点的元素(例如<img.../>),可以使用下面的调用

最后,在文档的结尾,调用

这个调用将关闭所有打开的元素。

与使用DOM/XSLT的方式一样,我们不必担心属性值和字符数据中的转义字符。但是,我们仍旧有可能会产生非良构的XML,例如具有多个根节点的文档。并且,StAX当前的版本还没有任何对产生缩进输出的支持。

程序清单3-10中的程序展示了写出XML的两种方式。程序清单3-11和程序清单3-12展示了用于矩形绘画的窗体类和构件类。

程序清单3-10 write/XMLWriteTest.java

程序清单3-11 write/XMLWriteFrame.java

程序清单3-12 write/RectamgleComponent.java

javax.xml.stream.XMLOutputFactory 6

·static XMLOutputFactory newInstance()

返回XMLOutputFactory类的一个实例。

·XMLStreamWriter createXMLStreamWriter(OutputStream in)

·XMLStreamWriter createXMLStreamWriter(OutputStream in,String characterEncoding)

·XMLStreamWriter createXMLStreamWriter(Writer in)

·XMLStreamWriter createXMLStreamWriter(Result in)

创建写出到给定流、写出器或JAXP结果的写出器。

javax.xml.stream.XMLStreamWriter 6

·void writeStartDocument()

·void writeStartDocument(String xmlVersion)

·void writeStartDocument(String encoding,String xmlVersion)

在文档的顶部写入XML处理指令。注意,encoding参数只是用于写入这个属性,它不会设置输出的字符编码机制。

·void setDefaultNamespace(String namespaceURI)

·void setPrefix(String prefix,String namespaceURI)

设置默认的命名空间,或者具有前缀的命名空间。这种声明的作用域只是当前元素,如果没有写明具体元素,其作用域为文档的根。

·void writeStartElement(String localName)

·void writeStartElement(String namespaceURI,String localName)

写出一个开始标签,其中namespaceURI将用相关联的前缀来代替。

·void writeEndElement()

关闭当前元素。

·void writeEndDocument()

关闭所有打开的元素。

·void writeEmptyElement(String localName)

·void writeEmptyElement(String namespaceURI,String localName)

写出一个自闭合的标签,其中namespaceURI将用相关联的前缀来代替。

·void writeAttribute(String localName,String value)

·void writeAttribute(String namespaceURI,String localName,String value)

写出一个用于当前元素的属性,其中namespaceURI将用相关联的前缀来代替。

·void writeCharacters(String text)

写出字符数据。

·void writeCData(String text)

写出CDATA块。

·void writeDTD(String dtd)

写出dtd字符串,该字串需要包含一个DOCTYPE声明。

·void writeComment(String comment)

写出一个注释。

·void close()

关闭这个写出器。