用jdom轻松整合java和xml(二)
获取XML文档
jdom用org.jdom.Document类的一个实例来描述一个XML文档。这个文档类是一个轻重量级的,它可以包括文档类型、多处理指令的对象、一个根元素和注释对象。你可以不需要构造器而从草稿构造一个文档。
Document doc = new Document(new Element("rootElement"));
在下一篇文章中,我们会讨论从草稿构造一个XML文档是多么的容易。但是现在,我们从一个已存在的文件、一个流、或是一个URL路径中构造我们的文档。
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(url);
你可以用org.jdom.input包中提供的构造类从任何数据源中构造文档。最近,有两种构造方式:SAXBuilder 和 DOMBuilder。SAXBuilder用sax解析器从文件中构造文档。SAXBuilder侦听sax事件并从内存中建立一个相应的文档。这种方式非常快(基本上和sax一样快),这也是我们推荐的方式。DOMBuilder是另一种可选的方式,它从一个存在的org.w3c.dom.Document对象中建立JDOM文档。它允许jdom轻松的和构建DOM树的工具实现接口。
Jdom的速度有值得期待的提高的潜力通过一个延期的构造器的完成。这个构造器检查XML数据源,但当请求的时候才对它解析。例如:文档的属性当不访问时是不需要解析的。
构造器仍在发展,可以通sql查询、ldap查询和其他的数据格式来够造jdom文档。所以,一旦进到内存中,文档就和建造它的工具没有关系了。
SAXBuilder 和 DOMBuilder构造器允许用户指明他们是否应该轮换,以便确定哪个解析器时间执行解析的任务。
public SAXBuilder(String parserClass, boolean validation);
public DOMBuilder(String adapterClass, boolean validation);
默认的是用apache的开源 Xerces解析器并且是关闭轮换的。你应该注到DOMBuilder不象一个解析类,倒更象一个适配类。这是因为不是所有的DOM解析器都是相同的api。为了仍让用户选择喜欢的解析器,jdom使用一个对所有的dom解析器适用的公共的api的适配类。这个适配类支持所有流行的dom解析器,包括Apache 的 Xerces, Crimson,IBM 的 XML4J, Sun 的 Project X, 和Oracle 的 parsers V1 and V2.每一个解析器通过正确的调用别的解析器的方法执行标准的接口。这有点象jaxp,除了它支持jaxp所不支持的新的解析器。
输出XML文档
你可以用几种不同的标准输出工具输出一个XML文档。org.jdom.output.XMLOutputter也许是最常用方法。它将xml文档写入一个特定的OutputStream.
SAXOutputter工具是另一个选择。它产生基于jdom xml文档的sax事件,你可以把这些送到等待这些sax事件的应用程序那里。相同的方式,DOMOutputter产生一个dom文档,这样你就可以把它送给可以接收dom文档的应用程序。输出xml文档的代码看起来象下边的样子:
XMLOutputter outputter = new XMLOutputter();
outputter.output(doc, System.out);
XMLOutputter用参数定制输出的格式。第一个参数是行缩进的格式;第二个参数是你是否想另起一行。因为机器到机器的原因,为了速度考虑你可以放弃行缩进和另起新行。
XMLOutputter outputter = new XMLOutputter("", false);
outputter.output(doc, System.out);
(译注:这样的话自己看起来会很不好看,而且每一次重新写入的时候都会使这个xml文件变大,所以我建议还是要缩进和另起一行,支持中文的带换行和缩进的格式如下:
XMLOutputter outp = new XMLOutputter(“”,true,"GB2312");
outp.setTextTrim(true);
outp.output(doc, System.out);
可以参见以前我写的jdom的文章http://www.csdn.net/Develop/read_article.asp?id=20720)
下面是读入一个xml文档,并把它又输出的例子:
import java.io.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
public class PrettyPrinter {
public static void main(String[] args) {
// Assume filename argument
String filename = args[0];
try {
// Build the document with SAX and Xerces, no validation
SAXBuilder builder = new SAXBuilder();
// Create the document
Document doc = builder.build(new File(filename));
// Output the document, use standard formatter
XMLOutputter fmt = new XMLOutputter();
fmt.output(doc, System.out);
} catch (Exception e) {
e.printStackTrace();
}
}
}
资源:
Read Part 2 of "Easy Java/XML Integration with JDOM," Jason Hunter and Brett McLaughlin (July, 2000) to learn how to use JDOM to create and mutate XML:
http://www.javaworld.com/javaworld/jw-07-2000/jw-0728-jdom2.html
The home of JDOM:
Mailing list sign-up for jdom-interest and jdom-announce, as well as list archives:
http://jdom.org/involved/lists.html
The JDOM announcement press release:
http://www.oreillynet.com/pub/a/mediakit/pressrelease/20000427.html
More information on DOM:
More information on SAX:
More information on JAXP: