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