浅谈Java开源XML工具包dom4j
创始人
2024-03-24 21:30:32
0

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);
}

读取一个根节点带有默认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;

【编辑推荐】

  1. JavaFX HTTP网络和XML分析
  2. 详解Java解析XML的四种方法
  3. XML新手入门 创建构造良好的XML

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
范例解读VB.NET获取环境变... VB.NET编程语言的使用范围非常广泛,可以帮助开发人员处理各种程序中的需求,而且还能对移动设备进行...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
规避非法攻击 用好路由器远程管... 单位在市区不同位置设立了科技服务点,每一个服务点的员工都通过宽带路由器进行共享上网,和单位网络保持联...