Java Xml 简明教程

Java StAX Parser - Create XML Document

Java StAX 解析器是一个 Java API,提供创建 XML 文档的接口。包含光标 API(如 XMLStreamWriter)和迭代器 API(如 XMLEventWriter),用于创建 XML 文档。在本章中,我们将使用 XMLStreamWriter 来创建 XML 文档。该接口包括 writeStartDocument()、writeStartElement()、writeCharacters() 等方法,用于写入 XML 内容。

Create XML using Java StAX parser

我们可以按照以下步骤,使用 StAX 解析器在 Java 中创建一个 XML 文档:

  1. * 第 1 步:* 创建 XMLStreamWriter 对象

  2. * 第 2 步:* 编写 XML 文档

  3. * 第 3 步:* 创建 XMLStreamReader 对象

  4. * 第 4 步:* 将内容写入文件

  5. * 第 5 步:* 使用控制台测试输出

Step 1: Creating XMLStreamWriter object

XMLOutputFactory 是一个用于创建 XMLEventWriters 和 XMLStreamWriters 的抽象类。我们可以使用 XMLEventWriter 或 XMLStreamWriter 对象来写入 XML 文档。

XMLOutputFactory 的 createXMLStreamWriter() 方法创建一个 XMLStreamWriter 对象,参数可以是 Writer、OutputStream 或任何 JAXP 结果。在此,我们创建了一个写入 Writer 流的 XMLStreamWriter。

XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newInstance();
XMLStreamWriter xMLStreamWriter = xMLOutputFactory.createXMLStreamWriter(Writer stream);

Step 2: Writing the XML document

XMLStreamWriter 接口包含许多方法,用于指定如何编写 XML 文档。这些方法均有自解释性,不返回任何内容,而是将内容写入 Writer。以下列出了 XMLStreamWriter 接口中几种最常用的方法:

xMLStreamWriter.writeStartDocument();
xMLStreamWriter.writeStartElement("cars");
xMLStreamWriter.writeCharacters("Ferrari");
xMLStreamWriter.writeEndElement();
xMLStreamWriter.writeEndDocument();

Step 3: Creating XMLStreamReader object

XMLInputFactory 是一个用于获取流的抽象类。使用 createXMLStreamReader() 方法,我们可以创建一个 XMLStreamReader 对象,能够读取指定的 InputStream。它提供向 XML 数据 InputStream 的前向、只读访问。

XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader streamReader = factory.createXMLStreamReader(InputStream stream);

Step 4: Writing the content into file

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);

Step 5: Testing the output using console

我们可以将“System.out”作为 StreamResult 的参数,在控制台上打印文件内容。Transformer 类的 transform() 方法将源转换为 StreamResult,并将其写入控制台。

另一种打印结果的方法是,简单地将我们用于 XMLStreamWriter 的 Writer 对象转换为 String,然后再在控制台上打印该字符串。

StreamResult consoleResult = new StreamResult(System.out);
transformer.transform(source, consoleResult);

Creating Basic XML file

writeStartDocument() 方法将 XML 声明写入默认版本号为 1.0,编码为 utf-8。

writeStartElement("element_name") 方法使用指定参数名作为元素名称打开新的起始标签。一旦我们指定相应的 EndElement,作用域将关闭。

writeCharacters("text_content") 方法将指定的文本内容追加到元素。

Example

以下是我们想要创建的基本 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();
      }
   }
}

Output

我们使用 XMLStreamWriter 写入的 XML 文档显示如下 -

<?xml version="1.0" ?><cars>Ferrari</cars>

Creating XML file with Attributes

writeAttribute("attr_name","attr_value") 方法将属性追加到当前元素。它应写入在 writeStartElement() 和 witeEndElement() 方法之间。如果将此方法不正确地置于元素范围之外,它会导致 IllegalStateException 错误。

Example

我们必须创建以下 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();
      }
   }
}

Output

输出窗口显示使用 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>