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 步:* 创建 XMLStreamWriter 对象
-
* 第 2 步:* 编写 XML 文档
-
* 第 3 步:* 创建 XMLStreamReader 对象
-
* 第 4 步:* 将内容写入文件
-
* 第 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();
}
}
}
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();
}
}
}