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