爪哇国新游记之三十四----Dom4j的XPath操作
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操作的更多相关文章
- 爪哇国新游记之十四----初试JDBC
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...
- 爪哇国新游记之十九----使用Stack检查数字表达式中括号的匹配性
/** * 辅助类 * 用于记载字符和位置 * */ class CharPos{ char c; int pos; public CharPos(char c,int pos){ this.c=c; ...
- 爪哇国新游记之二十二----排序判断重复时间复杂度为2n的位图法
import java.util.ArrayList; import java.util.List; /** * 位图法 * 用于整型数组判重复,得到无重复列表 * */ public class B ...
- 爪哇国新游记之二十九----访问URL获取输入流
代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import ...
- 爪哇国新游记之二十八----从url指定的地址下载文件到本地
package download; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; ...
- Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复217或者20160330可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- 爪哇国新游记之十三----XML文件读写
/** * XML读写示例 * @author hx * */ public class XmlReaderWriter{ /** * 读取一个XML文件,返回一个雇员链表 * @param file ...
- 爪哇国新游记之七----使用ArrayList统计水果出现次数
之前学习制作了DArray,了解ArrayList就容易了. /** * 用于存储水果名及数量 * */ public class Fruit{ private String name; public ...
- 爪哇国新游记之二----用于计算三角形面积的Point类和TAngle类
这次尝试用两个类完成一个面积计算任务: Point类代表平面上的点: public class Point { private float x; private float y; public Poi ...
随机推荐
- WebRTC手记之本地视频采集
转载请注明出处:http://www.cnblogs.com/fangkm/p/4374610.html 前面两篇文章介绍WebRTC的运行流程和使用框架接口,接下来就开始分析本地音视频的采集流程.由 ...
- USACO 5.4 Telecowmunication(最大流+枚举)
面对最小割之类的题目,完全木想法... 枚举+最大流..复杂度很大了...居然很快的就过了.. /* ID: cuizhe LANG: C++ TASK: telecow */ #include &l ...
- USACO 5.4 Character Recognition(DP)
非常恶心的一题,卡了三个月,没什么动力做了,代码直接抄的别人的... 这题主要思路就是预处理出几个数组,再预处理出几个数组,最后DP,输出一下路径... 写起来挺非常麻烦,代码不贴了,丢人... 把U ...
- java获取获得Timestamp类型的当前系统时间
java获取取得Timestamp类型的当前系统时间java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new T ...
- 使 SortList 实现重复键排序
SortList 默认对按Key来排序,且Key值不能重复,但有时可能需要用有重复值的Key来排序,以下是实现方式: 1.对强类型:以float为例 #region 使SortList能对重复键排序 ...
- 使用本地yum源
[root@xaiofan ~]# mount /dev/sr0 /mnt/ [root@xaiofan ~]# cat /etc/yum.repos.d/local.repo [loacl]name ...
- freeswitch
FreeSWITCH 是一个电话的软交换解决方案,包括一个软电话和软交换机用以提供语音和聊天的产品驱动.FreeSWITCH 可以用作交换机引擎.PBX.多媒体网关以及多媒体服务器等.可以用作一个简单 ...
- Apache Spark源码走读之9 -- Spark源码编译
欢迎转载,转载请注明出处,徽沪一郎. 概要 本来源码编译没有什么可说的,对于java项目来说,只要会点maven或ant的简单命令,依葫芦画瓢,一下子就ok了.但到了Spark上面,事情似乎不这么简单 ...
- Yii源码阅读笔记(十)
控制器类,所有控制器的基类,用于调用模型和布局,输出到视图 namespace yii\base; use Yii; /** * Controller is the base class for cl ...
- C#winform项目添加引用编译文件
打开opencv(Emgu for windows)样例,发现有带引用图标的文件 以前还真没见过这种用法,研究了一下: 1.项目版本信息文件内容及添加: 通过修改项目目录下的csproj(c shar ...