将 XML 持久化存储到文件中去
1. 使用 DOM 和 JDOM 之类的 API 将 XML 数据结构直接写入文件
2. 使用 Transformation API for XML (TrAX) 和标识转换(identity transformation)持久化存储您的 XML
3. 使用 JAXB 之类的较高级别的 API 处理持久化存储
如果使用一个或多个 API 读取 XML,那么很明显的一个方法就是使用与之相 同的 API 将 XML 写入文件。比如说,如果您使用 JDOM API 和一个 JDOM Document 对象操作 XML,那么可以编写以下代码:
XMLOutputter outputter = new XMLOutputter();
outputter.setFormat(Format.getPrettyFormat());
outputter.output(myDocument, new FileWriter ("outputFile.xml"));
与此类似,在 DOM Level 3 中可以使用新的 Load 和 Save API:
DOMWriter writer = new org.apache.xml.serialize.XMLSerializer();
writer.setNewLine("\r\n");
writer.setEncoding("UTF-8");
writer.writeNode(new FileOutputStream(new File("outputFile.xml")), myDocument);
注意,使用新 DOM API 的方法多种多样,其中有一些具有较低的供应商独立 性。上面的示例代码中含有一个特定于 Xerces 的类,但是其他方法不会像它一 样与某个特定的供应商类紧密绑定在一起。从学习的角度来说,那些方法都不够 直观,因此我保留了特定于供应商的代码。
另一个流行的选择是使用 TrAX 和标识转换。TrAX 是 Transformation API for XML 的缩写,它现在是 JAXP 的一部分,而 Java 平台的每一个发行版中都 含有 JAXP(除了 Micro Edition)。TrAX 允许您使用 XSL 样式表对 XML 进行 转换。由于 XML 经常需要结合 SAX 和 DOM 一起使用,因此 TrAX 可以接收 SAX 事件和 DOM Document 作为输入,并能够轻易地产生输出文件。此外,TrAX 还可以轻松地对这些格式进行相互转换。比如说,您可以使用以 DOM 表示的 XML 文档作为输入,并对它进行转换,然后再将输出发送到文件中。或者您也可 以读取文件中的内容,并对它进行转换操作,然后再将结果文档存储到 DOM Document 中。
这种方法的另外一个作用是,您可以使用一个不含任何文档操作的样式表, 并使用某种格式作为输入,然后将这种格式输出为任意其他的格式。使用不具转 换功能的样式表 — 实际上指不执行任何操作但回转所接收的输入内容的样式表 — 称作 标识转换(identity transformation)。因此您可以从文件中获得文 档,然后应用标识转换,最终在 DOM Document 中生成相同的 XML。如果您采用 相反的方式 — 从 DOM 到文件 — 那么实际上可以实现持久化存储 XML。这种 方法类似于以下过程:
Source domSource = new DOMSource(myDOMDocument);
Result fileResult = new StreamResult(new File ("outputFile.xml"));
TransformerFactory factory = TransformerFactory.newInstance ();
Transformer transformer = factory.newTransformer();
transformer.transform(domSource, fileResult);
此处,DOM 文档中的 XML 最终转换为了一个 outputFile.xml 文件。
将 XML 转换为静态格式的另一种方法 — 特别是您希望这种格式是位于磁盘 上的文件 — 是使用 JAXB 之类的数据绑定 API。虽然通常人们不会考虑使用数 据绑定来实现持久化存储,但是它可以有效地实现:读取内存中表示的 XML 文 档并将其写入文件。
我没有太多时间详细介绍数据绑定的概念(您可以在 developerWorks 网站 上阅读一些这方面的文章);下面这段简短的代码使用了 JAXB 方式的数据绑定 实现持久性存储:
FileOutputStream stream = new FileOutputStream ("outputFile.xml");
Marshaller marshaller = myJaxbContext.createMarshaller();
marshaller.marshal(myJavaObject, stream);
您可以设置一些选项,比如说输出文件的编写,所有设置都在 Marshaller 对象中。事实上,JAXB 在设置输出属性方面的灵活性与前面两种方法是不相上 下的。