JDOM 使用标准的 Java 编码模式。只要有可能,它使用 Java new 操作符而不用复杂的工厂化模式,使对象操作即便对于初学用户也很方便。例如,让我们看一下如何随便使用 JDOM 建立一个简单的 XML 文档。我们将要建立的结构如清单 1 所示。(从 参考资料上可下载关于本文的完整代码)
建立 XML 文档样本
引用
<?xml version="1.0" encoding="UTF-8"?>
<car vin="123fhg5869705iop90">
<!--Description of a car-->
<make>Toyota</make>
<model>Celica</model>
<year>1997</year>
<color>green</color>
<license state="CA">1ABC234</license>
</car>
注意:我们将建立 示例文档,在下面的清单 2 到清单 7 中有详细描述。
开始,让我们先创建一个根元素,并将其添加到文档中:
创建一个 Document
引用
Element carElement = new Element("car");
Document myDocument = new Document(carElement);
这一步创建一个新 org.jdom.Element ,并将其作为 org.jdom.Document myDocument 的根元素。(如果您使用 参考资料中提供的样本代码,请务必导入 org.jdom.* 。)因为一个 XML 文档必须一直有一个唯一的根元素,所以 Document 将 Element 放在它的构造器中。
下一步,添加 vin 属性:
引用
carElement.addAttribute(new Attribute("vin", "123fhg5869705iop90"));
添加元素也是很简单的。这里我们添加 make 元素:
引用
Element make = new Element("make");
make.addContent("Toyota");
carElement.addContent(make);
由于 Element 的 addContent 方法返回 Element ,我们也可以这样写:
引用
carElement.addContent(new Element("make").addContent("Toyota"));
这两个语句完成了相同的工作。有些人认为第一个示例可读性更好,但是如果您一次建立许多元素,您会觉得第二个示例可读性更好。要完成构建文档:
引用
carElement.addContent(new Element("model").addContent("Celica"));
carElement.addContent(new Element("year").addContent("1997"));
carElement.addContent(new Element("color").addContent("green"));
carElement.addContent(new Element("license")
.addContent("1ABC234").addAttribute("state", "CA"));
您会注意到对于 license 元素,我们不但添加了元素的内容,还为其添加了一个属性,表明许可已被发出了这个状态。这是因为 Element 的 addContent 方法总是返回 Element 本身,而不是一个无效的声明。
用同样的方法添加注释部分或其它标准 XML 类型:
引用
carElement.addContent(new Comment("Description of a car"));
操作文档也是用类似方式。例如,要引用 year 元素,我们使用 Element 的 getChild 方法:
引用
Element yearElement = carElement.getChild("year");
该语句实际上将返回第一个元素名为 year 的子 Element 。 如果没有 year 元素,则调用返回一个空值。注意,我们不必回溯来自任何类似于 DOM Node 接口的返回值 -- Element 的子元素就是 Element 。用类似的方式,我们可把 year 元素从文档中除去:
引用
boolean removed = carElement.removeChild("year");
这次调用将只除去 year 元素;文档的其余部分保持不变。
到目前为止,我们已经涵盖了文档的生成和操作。要将完成的文档输出至控制台,可使用 JDOM 的 XMLOutputter 类:
引用
try {
XMLOutputter outputter = new XMLOutputter(" ", true);
outputter.output(myDocument, System.out);
} catch (java.io.IOException e) {
e.printStackTrace();
}
XMLOutputter 有几个格式选项。这里我们已指定希望子元素从父元素缩进两个空格,并且希望元素间有空行。 XMLOutputter 可输出到 Writer 或 OutputStream 。为输出到文件,我们可以简单地将输出行简化为:
引用
FileWriter writer = new FileWriter("/some/directory/myFile.xml");
outputter.output(myDocument, writer);
writer.close();
与其它方法良好协作:和现有的 XML 工具进行互操作
JDOM 的一个有趣特征是和其它 API 有互操作性。使用 JDOM,不仅能把文档输出到 Stream 或 Reader ,还可将文档作为 SAX Event Stream 或作为 DOM Document 。这种灵活性允许 JDOM 能在多种环境下使用或被添加到已经在使用另一种方法处理 XML 的系统中去。正如我们在后面一个示例中所看到的,它还允许 JDOM 使用其它的还不能识别 JDOM 的数据结构的 XML 工具。
JDOM 的另一个用处是它能够读取并操作现有的 XML 数据。使用 org.jdom.input 中的一个类可以阅读结构很规范的 XML 文件。在这个示例中我们使用 SAXBuilder :
引用
try {
SAXBuilder builder = new SAXBuilder();
Document anotherDocument =
builder.build(new File("/some/directory/sample.xml"));
} catch(JDOMException e) {
e.printStackTrace();
} catch(NullPointerException e) {
e.printStackTrace();
}
您可以用清单 2 到清单 7 中显示的方法来操作通过这个过程建立的文档。
JDOM 的另一个实用应用程序将其与 Apache 的 Xalan 产品结合在一起(请参阅 参考资料)。使用上面的汽车示例,我们将为在线汽车经销商建立一个 Web 页面,显示特定汽车的详细信息。首先,假设我们上面建立的文档显示我们准备呈现给用户的汽车的信息。下一步,我们将把这个 JDOM Document 与一个 XSL 样式表结合起来并把 HTML 格式的结果输出到 servlet 的 OutputStream 上以便在用户的浏览器中显示。
在本例中,我们准备使用的 XSL 样式表被称为 car.xsl :
引用
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/car">
<html>
<head>
<title><xsl:value-of select="make"/> <xsl:value-of select="model"/>
</head>
<body>
<h1><xsl:value-of select="make"/></h1><br />
<h2><xsl:value-of select="model"/></h2><br />
<table border="0">
<tr><td>VIN:</td><td><xsl:value-of select="@vin"/></td></tr>
<tr><td>Year:</td><td><xsl:value-of select="year"/></td></tr>
<tr><td>Color:</td><td><xsl:value-of select="color"/></td></tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
现在我们将把 org.jdom.Document 转换为 DOM Document ,并将其与显示我们的 XSL 和 OutputStream 的文件一起提供给 Xalan, OutputStream 是我们从我们假定的使用 servlet(如清单 14 所示)的应用服务器上获取的。
引用
TransformerFactory tFactory = TransformerFactory.newInstance();
// Make the input sources for the XML and XSLT documents
org.jdom.output.DOMOutputter outputter = new org.jdom.output.DOMOutputter();
org.w3c.dom.Document domDocument = outputter.output(myDocument);
javax.xml.transform.Source xmlSource =
new javax.xml.transform.dom.DOMSource(domDocument);
StreamSource xsltSource =
new StreamSource(new FileInputStream("/some/directory/car.xsl"));
// Make the output result for the finished document using
// the HTTPResponse OutputStream
StreamResult xmlResult = new StreamResult(response.getOutputStream());
// Get a XSLT transformer
Transformer transformer = tFactory.newTransformer(xsltSource);
// Do the transform
transformer.transform(xmlSource, xmlResult);
在这个示例中,输出是通过 Java servlet 的 HTTPResponse OutputStream 流出。然而,输出流可以象早期的使用 XMLOutputter 的实例一样简单的通过文件流输出。我们使用 DOMOutputter 为 Xalan 生成 XML 源代码。但是我们可以生成相同的输出,方法是使用 XMLOutputter 将我们的 XML 文档作为 String 输出并使其进入 StreamSource 。说到灵活性:JDOM 可将它的结构作为 String 、SAX Event Stream 或 DOM Document 输出。这允许 JDOM 与能把任何这些模型作为输入的工具一起工作。(关于附加功能,请访问 JDOM Web 站点的 contrib 包,在那里您将发现一个基于 JDOM 工具的宝库,可提供基于 JDBC ResultSet 的构建器、XPATH 实现方法和其它更多工具。)
在短短几行代码中,JDOM 启用了许多功能,我们已经在 XML 中分析过并有计划地创建了 XML 文档,操作了那些文档,并使用它们产生 XML 驱动的 Web 页面。
来自:http://www.ibm.com/developerworks/cn/java/j-jdom/index.html