Dom4j是Java访问XML的利器之一,另一个是JDom。记得当年因为粗掌握点JDomAPI但项目要求使用Dom4j还闹一阵情绪,现在看来真是没必要,只花一些时间成本就进去一个新世界绝对是值得做的一件事。更何况JDom因无人更新而停顿了。

Dom4j有两个包,一个是dom4j-1.6.1.jar,它提供基本的XML API支持,如访问节点,属性等。

还有一个是jaxen-1.1-beta-9.jar,它提供XPath支持。

关于XPath的语法,请见转载:XPath基本语法

言归正传,下面请看例程。

1.访问节点群

XML样本:

<applications>
    <application name='chat'>
        <mtLanguage source='ar_ar' target='en_us' />
        <mtLanguage source='zh_cn' target='en_us' />
        <mtLanguage source='zh_tw' target='en_us' />
        <mtLanguage source='en_us' target='ar_ar' />
        <mtLanguage source='en_us' target='zh_cn' />
        <mtLanguage source='en_us' target='zh_tw' />
        <mtLanguage source='en_us' target='fr_fr' />
        <mtLanguage source='en_us' target='de_de' />
        <mtLanguage source='en_us' target='it_it' />
        <mtLanguage source='en_us' target='ja_jp' />
        <mtLanguage source='en_us' target='ko_kr' />
        <mtLanguage source='en_us' target='pt_br' />
        <mtLanguage source='en_us' target='ru_ru' />
        <mtLanguage source='en_us' target='es_es' />
        <mtLanguage source='fr_fr' target='en_us' />
        <mtLanguage source='de_de' target='en_us' />
        <mtLanguage source='it_it' target='en_us' />
        <mtLanguage source='ja_jp' target='en_us' />
        <mtLanguage source='ko_kr' target='en_us' />
        <mtLanguage source='pt_br' target='en_us' />
        <mtLanguage source='ru_ru' target='en_us' />
        <mtLanguage source='es_es' target='en_us' />
    </application>
    <application name='doc'>
        <mtLanguage source='ar_ar' target='en_us' />
        <mtLanguage source='zh_cn' target='en_us' />
        <mtLanguage source='zh_tw' target='en_us' />
        <mtLanguage source='en_us' target='ar_ar' />
        <mtLanguage source='en_us' target='zh_cn' />
        <mtLanguage source='en_us' target='zh_tw' />
        <mtLanguage source='en_us' target='fr_fr' />
        <mtLanguage source='en_us' target='de_de' />
        <mtLanguage source='en_us' target='hi_in' />
        <mtLanguage source='en_us' target='it_it' />
        <mtLanguage source='en_us' target='ja_jp' />
        <mtLanguage source='en_us' target='ko_kr' />
        <mtLanguage source='en_us' target='pt_br' />
        <mtLanguage source='en_us' target='ru_ru' />
        <mtLanguage source='en_us' target='es_es' />
        <mtLanguage source='en_us' target='ur_pk' />
        <mtLanguage source='fr_fr' target='en_us' />
        <mtLanguage source='de_de' target='en_us' />
        <mtLanguage source='hi_in' target='en_us' />
        <mtLanguage source='it_it' target='en_us' />
        <mtLanguage source='ja_jp' target='en_us' />
        <mtLanguage source='ko_kr' target='en_us' />
        <mtLanguage source='pt_br' target='en_us' />
        <mtLanguage source='ru_ru' target='en_us' />
        <mtLanguage source='es_es' target='en_us' />
        <mtLanguage source='ur_pk' target='en_us' />
    </application>
</applications>

现在,如果我想要访问属性为chat的application节点下的所有mtLanguage子节点,XPath应该这样写:

//applications/application[@name='chat']/mtLanguage

而具体操作的Java语句是:

Document doc= DocumentHelper.parseText(responseXML);// 这个responseXML就是上面的XML样例
List<?> elms=doc.selectNodes("//applications/application[@name='chat']/mtLanguage");
System.out.println("There are "+elms.size()+" language pairs available in text translation");

for(Object obj:elms){
     Element elm=(Element)obj;
     System.out.println("From "+elm.attributeValue("source")+" to "+elm.attributeValue("target"));
}

执行上面语句输出如下:

There are 22 language pairs available in text translation
From ar_ar to en_us
From zh_cn to en_us
From zh_tw to en_us
From en_us to ar_ar
From en_us to zh_cn
From en_us to zh_tw
From en_us to fr_fr
From en_us to de_de
From en_us to it_it
From en_us to ja_jp
From en_us to ko_kr
From en_us to pt_br
From en_us to ru_ru
From en_us to es_es
From fr_fr to en_us
From de_de to en_us
From it_it to en_us
From ja_jp to en_us
From ko_kr to en_us
From pt_br to en_us
From ru_ru to en_us
From es_es to en_us

2.访问特定节点

XML样本:

<rep sts="OK" a="trep" tl="zh-CN">
    <docs>
        <d dt="ndoc" did="d20160223213120480009045125076363146" lang="en-US"
            ctime="2016-02-23T21:31:20" mtime="2016-02-23T21:31:20" orig="1"
            mime="text/x-mt-xml" wc="2">
            <p pid="1" wc="2">
                <s sid="1">
                    <t tid="1" tt="orig" wc="2">Good evening</t>
                </s>
            </p>
        </d>
        <d dt="ndoc" did="d20160223213120480009045125076363146" lang="zh-CN"
            ctime="2016-02-23T21:31:20" mtime="2016-02-23T21:31:20" orig="0"
            mime="text/x-mt-xml" sc="100.00" wc="1">
            <p pid="1" wc="1">
                <s sid="1">
                    <t tid="1" tt="mt" src="mt" sc="100.00" wc="1">晚上好</t>
                </s>
            </p>
        </d>
    </docs>
</rep>

如果我想得到上文中“晚上好”这段文字,XPath应该这样写

//rep/docs/d[last()]/p/s/t

对应的Java代码是:

Document doc= DocumentHelper.parseText(responseXML);
Element elm = (Element) doc.selectSingleNode("//rep/docs/d[last()]/p/s/t");
targetTxt=elm.getText();

3.取属性

XML样本:

<rep sts="OK" a="trep" tl="zh-CN">
    <docs>1</docs>
</rep>

要取根节点rep的sts属性,XPath可以这样写:

//rep/@sts

而对应的Java语句是:

System.out.println("XML="+responseXML);
Document doc= DocumentHelper.parseText(responseXML);
Attribute attr = (Attribute) doc.selectSingleNode("//rep/@sts");      

return attr.getText();

爪哇国新游记之三十四----Dom4j的XPath操作的更多相关文章

  1. 爪哇国新游记之十四----初试JDBC

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  2. 爪哇国新游记之十九----使用Stack检查数字表达式中括号的匹配性

    /** * 辅助类 * 用于记载字符和位置 * */ class CharPos{ char c; int pos; public CharPos(char c,int pos){ this.c=c; ...

  3. 爪哇国新游记之二十二----排序判断重复时间复杂度为2n的位图法

    import java.util.ArrayList; import java.util.List; /** * 位图法 * 用于整型数组判重复,得到无重复列表 * */ public class B ...

  4. 爪哇国新游记之二十九----访问URL获取输入流

    代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import ...

  5. 爪哇国新游记之二十八----从url指定的地址下载文件到本地

    package download; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; ...

  6. Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复217或者20160330可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  7. 爪哇国新游记之十三----XML文件读写

    /** * XML读写示例 * @author hx * */ public class XmlReaderWriter{ /** * 读取一个XML文件,返回一个雇员链表 * @param file ...

  8. 爪哇国新游记之七----使用ArrayList统计水果出现次数

    之前学习制作了DArray,了解ArrayList就容易了. /** * 用于存储水果名及数量 * */ public class Fruit{ private String name; public ...

  9. 爪哇国新游记之二----用于计算三角形面积的Point类和TAngle类

    这次尝试用两个类完成一个面积计算任务: Point类代表平面上的点: public class Point { private float x; private float y; public Poi ...

随机推荐

  1. 【C语言】06-基本数据类型

    C语言有丰富的数据类型,因此它很适合用来编写数据库,如DB2.Oracle都是C语言写的. C语言的数据类型大致可以分为下图中的几类: 回到顶部 一.变量 跟其他语言一样,C语言中用变量来存储计算过程 ...

  2. cvReleaseImage 释放内存出错

    cvReleaseImage是OpenCV中C语言库中的释放图片内存的函数,比如我们加载或者克隆了一幅图片,当不需要这幅图片了时,我们为了避免内存泄露,需要释放这些空间,可以参见我之前的博客OpenC ...

  3. JS。 问题类型:穷举,迭代。两个关键词:break和continue

    问题类型: 穷举:(在不知道什么情况下是我们需要的结果的时候只能够让它一个一个都给走一遍) 百鸡百钱:公鸡1钱,母鸡2钱,小鸡0.5钱. 思路: 公鸡买100只,母鸡,小鸡都是0只: 母鸡50只,公鸡 ...

  4. IOS第五天(2:用户登录,回车的监听(代理模式UITextFieldDelegate)) 和关闭键盘

    *********用户登录,回车的监听(代理模式UITextFieldDelegate) #import "HMViewController.h" @interface HMVie ...

  5. 如何搭建redis扩展-Yii中文网

    原文链接: 如何搭建redis扩展http://www.yii-china.com/post/detail/43.html 安装redis扩展: 1.通过composer进行安装,到项目根目录cmd运 ...

  6. css样式重置方案 -解决浏览器差异

    1.http://meyerweb.com/eric/tools/css/reset/ /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 2011 ...

  7. maven常用插件总结

    maven本质上是一个插件框架,几乎所有的功能都是通过各种各样的插件来实现的.maven默认会依据项目类型自动把构建时的各阶段(Lifecycle和phase)自动绑定(Lifecycle Mappi ...

  8. 【Spec for GS5】不要嘲笑程序员不懂烂漫

    // // main.cpp // 生日快乐 // // Created by wasdns on 16/11/21. // Copyright © 2016年 wasdns. All rights ...

  9. php isset() empty() 区别, 判断 变量存在与否神器

    先看PHP手册: bool empty ( mixed $var ) 判断一个变量是否被认为是空的.当一个变量并不存在,或者它的值等同于FALSE,那么它会被认为不存在.如果变量不存在的话,empty ...

  10. Memcached原理深度分析详解

    Memcached是 danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能.关于这个东 西,相信很多人都用过,本文意在通 ...