
- Java XML 教程
- Java XML 首頁
- Java XML 概述
- Java XML 解析器
- Java DOM 解析器
- Java DOM 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java SAX 解析器
- Java SAX 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- JDOM XML 解析器
- JDOM XML 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java StAX 解析器
- Java StAX 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java XPath 解析器
- Java XPath 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java DOM4J 解析器
- Java DOM4J 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java XML 有用資源
- Java XML - 問題與解答
- Java XML - 快速指南
- Java XML - 有用資源
- Java XML - 討論
Java StAX 解析器 - 建立 XML 文件
Java StAX 解析器是一個 Java API,它提供用於建立 XML 文件的介面。它有像 XMLStreamWriter 這樣的遊標 API 和像 XMLEventWriter 這樣的迭代器 API 來建立 XML 文件。在本章中,我們將使用 XMLStreamWriter 來建立 XML 文件。此介面具有 writeStartDocument()、writeStartElement()、writeCharacters() 等方法來寫入 XML 內容。
使用 Java StAX 解析器建立 XML
我們可以透過以下步驟在 Java 中使用 StAX 解析器建立 XML 文件:
- 步驟 1:建立 XMLStreamWriter 物件
- 步驟 2:寫入 XML 文件
- 步驟 3:建立 XMLStreamReader 物件
- 步驟 4:將內容寫入檔案
- 步驟 5:使用控制檯測試輸出
步驟 1:建立 XMLStreamWriter 物件
XMLOutputFactory 是一個抽象類,用於建立 XMLEventWriters 和 XMLStreamWriters。我們可以使用 XMLEventWriter 或 XMLStreamWriter 物件來寫入 XML 文件。
XMLOutputFactory 的 createXMLStreamWriter() 方法建立一個 XMLStreamWriter 物件,引數可以是 Writer、OutputStream 或任何 JAXP 結果。在這裡,我們建立了一個寫入 Writer 流的 XMLStreamWriter。
XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newInstance(); XMLStreamWriter xMLStreamWriter = xMLOutputFactory.createXMLStreamWriter(Writer stream);
步驟 2:寫入 XML 文件
XMLStreamWriter 介面有許多方法指定如何寫入 XML 文件。它們不言自明,並且不返回任何內容,而是將內容寫入 Writer。以下是 XMLStreamWriter 介面最常用的方法:
xMLStreamWriter.writeStartDocument(); xMLStreamWriter.writeStartElement("cars"); xMLStreamWriter.writeCharacters("Ferrari"); xMLStreamWriter.writeEndElement(); xMLStreamWriter.writeEndDocument();
步驟 3:建立 XMLStreamReader 物件
XMLInputFactory 是一個用於獲取流的抽象類。使用 createXMLStreamReader() 方法,我們可以建立一個 XMLStreamReader 物件,它允許我們讀取指定的 InputStream。它提供對 XML 資料的 InputStream 的向前、只讀訪問。
XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader streamReader = factory.createXMLStreamReader(InputStream stream);
步驟 4:將內容寫入檔案
Transformer 類的 transform() 函式將 XML 源轉換為結果。源可以是 DOMSource、SAXSource、StAXSource 或 StreamSource 型別,結果可以是 DOMResult、SAXResult、StAXResult 或 StreamResult 型別。
要建立 Transformer 物件,我們建立 TransformerFactory 的一個例項。這裡,源是 StAXSource 型別,結果是 StreamResult 型別。我們可以建立一個新的 File 物件並將其作為引數傳遞給 StreamResult 物件。
TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(source, result);
步驟 5:使用控制檯測試輸出
我們可以透過將 'System.out' 作為 StreamResult 的引數來列印控制檯上的檔案內容。Transformer 類的 transform() 方法將源轉換為 StreamResult 並將其寫入控制檯。
另一種列印結果的方法是簡單地將我們用於 XMLStreamWriter 的 Writer 物件轉換為字串並在控制檯上列印該字串。
StreamResult consoleResult = new StreamResult(System.out); transformer.transform(source, consoleResult);
建立基本 XML 檔案
writeStartDocument() 方法寫入 XML 宣告,預設版本號為 1.0,編碼為 utf-8。
writeStartElement("element_name") 方法使用指定引數名稱作為元素名稱開啟一個新的開始標籤。一旦我們指定了相應的 EndElement,範圍就會關閉。
writeCharacters("text_content") 方法將指定的文字內容追加到元素。
示例
這是我們想要建立的基本 XML 檔案:
<?xml version="1.0" ?> <cars>Ferrari</cars>
CreateBasicXML.java 程式使用 XMLStreamWriter 類建立 cars.xml 檔案。我們使用了 writeStartDocument() 方法寫入 XML 宣告,writeStartElement("cars") 方法寫入名為 "cars" 的新元素,以及 writeCharactrs("Ferrari") 方法寫入文字內容。我們使用了 writeEndElement() 和 writeEndDocument() 方法來正確關閉範圍。
import java.io.ByteArrayInputStream; import java.io.File; import java.io.StringWriter; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stream.StreamResult; public class CreateBasicXML { public static void main(String[] args) throws TransformerException { try { //creating XMLStreamWriter XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newInstance(); StringWriter stringWriter = new StringWriter(); XMLStreamWriter xMLStreamWriter = xMLOutputFactory.createXMLStreamWriter(stringWriter); //Writing the XML document xMLStreamWriter.writeStartDocument(); xMLStreamWriter.writeStartElement("cars"); xMLStreamWriter.writeCharacters("Ferrari"); xMLStreamWriter.writeEndElement(); xMLStreamWriter.writeEndDocument(); xMLStreamWriter.flush(); xMLStreamWriter.close(); //Creating XMLStreamReader object String xmlString = stringWriter.getBuffer().toString(); ByteArrayInputStream input = new ByteArrayInputStream(xmlString.getBytes("UTF-8")); stringWriter.close(); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader streamReader = factory.createXMLStreamReader(input); //writing the content into XML file TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); StAXSource source = new StAXSource(streamReader); StreamResult result = new StreamResult(new File("D:\\cars.xml")); transformer.transform(source, result); //Testing the output using console System.out.println(xmlString); } catch (Exception e) { e.printStackTrace(); } } }
輸出
我們使用 XMLStreamWriter 編寫的 XML 文件顯示如下:
<?xml version="1.0" ?><cars>Ferrari</cars>
建立帶有屬性的 XML 檔案
writeAttribute("attr_name","attr_value") 方法將屬性追加到當前元素。它應該寫在 writeStartElement() 和 witeEndElement() 方法之間。如果此方法錯誤地放置在元素範圍之外,則會丟擲 IllegalStateException 錯誤。
示例
我們必須建立以下 cars.xml 檔案:
<cars> <supercars company="Ferrari"> <carname type="formula one">Ferrari 101</carname> <carname type="sports">Ferrari 202</carname> </supercars> </cars>
在以下 CreateAttributes.java 程式中,我們在 supercar 元素下建立了兩個 carname 元素以及屬性。
import java.io.ByteArrayInputStream; import java.io.File; import java.io.StringWriter; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stax.StAXSource; public class CreateAttributes { public static void main(String[] args) throws TransformerException { try { //creating XMLStreamWriter XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newInstance(); StringWriter stringWriter = new StringWriter(); XMLStreamWriter xMLStreamWriter = xMLOutputFactory.createXMLStreamWriter(stringWriter); //Writing the XML document xMLStreamWriter.writeStartDocument(); xMLStreamWriter.writeStartElement("cars"); xMLStreamWriter.writeStartElement("supercars"); xMLStreamWriter.writeAttribute("company", "Ferrari"); xMLStreamWriter.writeStartElement("carname"); xMLStreamWriter.writeAttribute("type", "formula one"); xMLStreamWriter.writeCharacters("Ferrari 101"); xMLStreamWriter.writeEndElement(); xMLStreamWriter.writeStartElement("carname"); xMLStreamWriter.writeAttribute("type", "sports"); xMLStreamWriter.writeCharacters("Ferrari 202"); xMLStreamWriter.writeEndElement(); xMLStreamWriter.writeEndElement(); xMLStreamWriter.writeEndDocument(); xMLStreamWriter.flush(); xMLStreamWriter.close(); //Creating XMLStreamReader object String xmlString = stringWriter.getBuffer().toString(); ByteArrayInputStream input = new ByteArrayInputStream(xmlString.getBytes("UTF-8")); stringWriter.close(); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader streamReader = factory.createXMLStreamReader(input); //writing the content into XML file TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); StAXSource source = new StAXSource(streamReader); StreamResult result = new StreamResult(new File("D:\\cars.xml")); transformer.transform(source, result); //Testing the output using console System.out.println(xmlString); } catch (Exception e) { e.printStackTrace(); } } }
輸出
輸出視窗顯示使用 XMLStreamWriter 生成的 XML 內容。
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> </cars>