快速业务通道

浅谈Java开源XML工具包dom4j - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

浅谈Java开源XML工具包dom4j

时间:2010-12-31 sexywp

dom4j为一个XML文档在内存中创建了一个树对象模型。 它提供了一组强大易用的API,通过XPath和XSLT来处理、操纵或者遍历XML文件,此外其中还集成了SAX、JAXP和DOM。

为了提供高度可配置的实现策略,dom4j基于接口设计。只需要提供一个DocumentFactory实现,您就可以创建您自己的XML树实现。这种设计,使得在扩展dom4j以定制您需要的特性时,能非常简单地重用dom4j的代码。

本文档将通过代码实例的方式为您提供一个dom4j的实践指南。在实验室项目中,这个开源工具包给我的工作带来了很大的便利,在这篇文章中,我将对项目中用到dom4j完成的任务做个总结,以期和互联网上的众多文档能够互相补充。

读取XML文件

一般性地读取XML文件,在dom4j中操作起来将非常简单。

public void readXMLSimple(File file) throws DocumentException{ //使用SAXReader读取XML文件 SAXReader sr = new SAXReader(); Document doc = sr.read(file); //使用XPath遍历一个XML文件的结点 Element root = doc.getRootElement(); List entryList1 = root.selectNodes("entry"); //或者 List entryList2 = doc.selectNodes("/feed/entry"); }

创建一个XML文档并记录到磁盘上

创建一个XML文件,并将其写到磁盘上,也可以使用非常简介的代码来完成,假设我们将上一个代码范例中得到的entry节点的列表,插入到一个新建的XML文档中,然后使用优美的缩进格式保存在磁盘上,我们可以像下面这样编码:

public void createXMLSimple(List entries, File f) throws FileNotFoundException, UnsupportedEncodingException, IOException{ Document doc = DocumentHelper.createDocument(); doc.addElement("feed"); Element root = doc.getRootElement(); Iterator i = entries.iterator(); while(i.hasNext()){ //从别的Dom中得到的Element都有其本身 //的root,所以必须创建副本才能插入另一个doc内 root.add(((Element)i.next()).createCopy()); } FileOutputStream os = new FileOutputStream(f); OutputFormat of = OutputFormat.createPrettyPrint(); XMLWriter xmlw = new XMLWriter(os,of); xmlw.write(doc); }

浅谈Java开源XML工具包dom4j(2)

时间:2010-12-31 sexywp

读取一个根节点带有默认Namespace的XML

如果我们刚才的代码范例读取的是符合Atom1.0标准的Feed,那么,根节点带有default namespace的http://www.w3.org/2005/Atom。读取这样的XML文档稍微有点麻烦,网上的代码很多,但是很多都不好用,我总结下来,基本上没有办法像你想的那么干净。

public void treatDefaultNamespace(File f) throws DocumentException{ SAXReader sr = new SAXReader(); Map ns = new HashMap(); ns.put("atom", "http://www.w3.org/2005/Atom"); sr.getDocumentFactory().setXPathNamespaceURIs(ns); //Element接口支持迭代器,在这里顺便展示一下 Element root = sr.read(f).getRootElement(); Iterator i = root.elementIterator(); while(i.hasNext()){ Element e = (Element) i.next(); //一旦指定了Namespace,则使用XPath的时候必须带上 //即便是默认的Namespace也一样,不过前面那个名字 //可以尽可能写得短,编码的时候方便,比如改成a String title = e.selectSingleNode("atom:title").getText(); System.out.println(title); } }

创建一个根节点带有默认Namespace的XML

创建一个带有default namespace的XML的方法,相当的tricky,因为你创建一个Element的方法有很多种,可以通过add方法,默认的建,也可以使用DocumentHelper对象来创建,不过,每种方法给你的结果都不同,往往让你大吃一惊。其他的那些方法,和得到的多种结果,大家可以在网上看,很多。我就提供一个能创建“干净”的XML的代码范例。

public void createXMLWithDefaultNamespace(List entries){ Document d = DocumentHelper.createDocument(); d.addElement("feed","http://www.w3.org/2005/Atom"); Element root = d.getRootElement(); //省略迭代entries代码 root.addElement("title").add(DocumentHelper.createCDATA(title)); root.addElement("id").add(DocumentHelper.createText(guid)); root.addElement("category").add(DocumentHelper.createText(category)); root.addElement("link").add(DocumentHelper.createText(permalink)); root.addElement("updated").add(DocumentHelper.createText(updated)); }

最后,罗列一下上文中用到的所有对象所在的包,没有列出的在J2SE内。

import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter;

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号