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>
廣告