摘要
JXPath是Apache组织提供的一个XPath实现,通过JXPath,你可以使用XPath的语法、函数访问不同的数据内容,包括java对象、
集合、xml内容、web应用环境下的各种对象等,本文中作者简单的介绍了JXPath,并且演示了如何通过JXPath提供的类库访问java对象、集
合和XML文件的详细过程,同时给出了简单的注释。
一、JXPath简介
JXPath是apache公司提供的XPath的java实现,属于jakarta的一部分,最新的版本是1.1,JXPath的主要功能在于一组
java类库来使用XPath的方式访问符合JavaBeans规范的java类、java集合(Collections)、其他具有动态属性的对象(如
Map、ServletContext等),同时提供了一套扩展机制使我们可以增加对这些对象之外的其他对象模型的支持。
[注]
1、关于XPath的更多内容请大家访问XPath的主页
http://www.w3schools.com/xpath/default.asp
2、关于JXPath的更多内容请大家访问JXPath的主页
http://jakarta.apache.org/commons/jxpath/index.html
二、环境准备
1、下载JXPath
JXPath最新版本的二进制代码下载地址为
http://apache.linuxforum.net/dist/jakarta/commons/jxpath/binaries/commons-jxpath-1.1.zip
2、下载eclipse
作者使用了eclipse作为开发工具,请大家到http://www.eclipse.org/
下载eclipse的最新版本。
3、下载Tomcat
作者使用了Tomcat作为Web容器来演示如何使用JXPath访问ServletContext中的对象,请大家到jakarta.apache.org
下载Tomcat的最新版本。
下面的几个章节将详细的演示如何使用JXPath来访问各种各样的对象,同时将演示如何通过JXPath来创建对象、修改对象的属性等功能。
三、使用JXPath访问对象内容
3.1 访问JavaBean的属性
1、准备一个符合要求的Java类
作者制作了一个Company类,它包括3个属性:ID、Name和Address,代码如下:
package org.vivianj.jxpath.examples.pub;
import java.util.Comparator;
import org.apache.log4j.Logger;
public class Company implements Comparator{
public static Logger logger = Logger.getLogger(Company.class);
private String name = "";
private int id = 0;
private String address = "";
public void setName(String p_name){
this.name = p_name;
}
public void setId(int p_id){
this.id = p_id;
}
public void setAddress(String p_address){
this.address = p_address;
}
public String getName(){
return this.name;
}
public int getId(){
return this.id;
}
public String getAddress(){
return this.address;
}
public int compare(Object o1, Object o2){
return 0;
}
public boolean equals(Object obj) {
boolean result = false;
if (obj instanceof Company){
Company company = (Company) obj;
if (company.getId()==this.id
&& company.getName().equals(this.getName())
&& company.getAddress().equals(this.getAddress()))
result = true;
}
return result;
}
}
2、使用JXPath来访问该java类的属性
现在我们使用JXPath来访问这个类的属性,测试代码如下:
//实例化一个Company对象
Company company = new Company();
//设置该对象的各个属性
company.setId(1);
company.setName("vivianj组织");
company.setAddress("www.vivianj.org");
//初始化JXPath的上下文环境
JXPathContext context = JXPathContext.newContext(company);
//使用XPath语法来访问该对象的属性
//getValue方法的参数"name"、"id"、"address"使用了XPath的语法,
//他们分别代表要访问company对象的属性name、id、address
String name = (String)context.getValue("name");
Integer id = (Integer) context.getValue("id");
String address = (String)context.getValue("address");
3.1.1 Lenient 访问模式
在上面的访问方式中有可能会出现这样的情况:如果你要访问的属性不是这个Java类的属性,那么执行过程中系统会抛出一个异常-- org.apache.commons.jxpath.JXPathException
:
No value(or pointer) for xpath: xxx(xxx是你要访问的属性的名称)。
这种情况对于程序的稳定性、健壮性是有害的,这时候我们应该使用JXPath提供的Lenient 访问模式来避免出现这样的情况,在Lenient 访问模式下,如果你访问了不存在的属性,系统会返回一个null,而不是抛出一个违例。
要使用Lenient 访问模式非常简单,只需要在代码中增加context.setLenient(true)调用就可以了,具体操作如下:
//实例化一个Company对象
Company company = new Company();
//设置该对象的各个属性
company.setId(1);
company.setName("vivianj组织");
company.setAddress("www.vivianj.org");
//初始化JXPath的上下文环境
JXPathContext context = JXPathContext.newContext(company);
//通知系统使用Lenient 访问模式
context.setLenient(true)
//使用XPath语法来访问该对象的属性
String name = (String)context.getValue("name1");
[注] name1 不是Company类的属性,但是由于使用了Lenient 访问模式,所以系统返回null。
3.2 访问嵌套属性
3.1中的例子演示了如何访问类的简单类型属性,如果类的属性本身就是一个类类型,情况会怎么样呢,下面的例子将演示这种访问方式:
1、准备Association类
Association类有一个属性company,他本身是Company类类型
package org.vivianj.jxpath.examples.pub;
import java.util.ArrayList;
import java.util.Collection;
public class Association {
private Company company;
public Company getCompany(){
return this.company;
}
public void setCompany(Company p_company){
this.company = p_company;
}
}
2、用JXPath访问嵌套属性
//实例化Association类
Association association = new Association();
//实例化Company类
Company company = new Company();
company.setId(1);
company.setName("vivianj组织");
company.setAddress("www.vivianj.org");
//设置Association对象的company属性
association.setCompany(company);
//初始化JXPath上下文
JXPathContext context = JXPathContext.newContext(association);
//使用Lenient访问模式访问嵌套属性
context.setLenient(true);
//通过JXPath方法获得指定属性的值
//其中getValue方法的参数"company/name"的
//第一部分company代表Association的属性company,
//第二部分("/"符号后面的部分)name代表是company对象的属性
String name = (String) context.getValue("company/name");
3.3 访问Java集合
JXPath可以访问Java集合的内容,这些集合包括java数组、Collection类及其子类,他们的访问方式基本类似,详细的情况请参照下面的程序代码:
1、扩展Association类,增加一个提供Company对象的数组的方法
给Association类增加一个方法getCompanysInArray方法,方法的签名和内容如下:
public Company[] getCompanysInArray(){
for (int i = 0 ; i < 5 ; i++){
//实例化新的Company对象
Company comp = new Company();
comp.setId(i);
comp.setName("Name" + i );
comp.setAddress("address" + i);
//将实例化的对象赋值给到数组的对应元素
companysInArray[i] = comp;
}
return companysInArray;
}
2、扩展Association类,增加一个提供Company对象的Collection的方法
给Association类增加一个方法getCompanysInCollection方法,方法的签名和内容如下:
public Collection getCompanysInCollection(){
for (int i = 0 ; i < 5 ; i++){
//实例化新的Company对象
Company comp = new Company();
comp.setId(i);
comp.setName("Name" + i );
comp.setAddress("address" + i);
//将实例化的对象增加到Collection中
companysInCollection.add(comp);
}
return companysInCollection;
}
3.3.1 访问方法
通过JXPath访问数组的详细代码如下:
//实例化Association类
Association association = new Association();
//初始化JXPath上下文
JXPathContext context = JXPathContext.newContext(association);
//使用Lenient访问模式访问嵌套属性
context.setLenient(true);
//通过JXPath语法访问数组下标为4的记录的name属性
//getValue方法的参数"companysInArray[5]/name"中的
//部分companysInArray是Association的属性,
//5代表访问数组中第5个元素,name表示第五个元素的属性名
String name = (String) context.getValue("companysInArray[5]/name");
//通过XPath语法访问集合中第4条记录的name属性
//getValue方法的参数" companysInColletion[5]/name"中的
//部分companysInColletion是Association的属性名,
//5代表访问集合中第5个元素,name表示第五个元素的属性名
String name = (String) context.getValue("companysInColletion[5]/name");
[注] XPath访问数组或者集合时,数组或者集合的下标是从1开始,这点和java语言中规定的从0开始有点不同
3.3.2 获取多条记录
既然是访问集合数据,那么经常会出现这样的需求:需要获得符合条件的多条记录。这种情况使用JXPath也非常方便,使用context对象的
iterator方法加上相应的XPath信息就可以了,操作后返回的内容保存在Iterator对象中,非常方便就可以访问。具体的代码如下:
1、按记录所在的位置获取
//实例化Association类
Association association = new Association();
//实例化JXPath上下文
JXPathContext context = JXPathContext.newContext(association);
//获得数组中下标大于3的所有记录
//iterator方法的参数companysInArray [position() > 3]使用了XPath的语法
//其中的companysInArray是Association对象的属性,他是一个数组
// position()是XPath中的内置函数,获得记录在数组中的下标
Itarator companysInArray =
context.iterate("companysInArray [position() > 3]");
//获得集合中所处位置大于3的所有记录
//iterator方法的参数companysInCollection [position() > 3]使用了XPath的语法
//其中的companysInCollection是Association对象的属性
//他是一个Collection类型或者是其子类型的一个实例
//position()是XPath中的内置函数,获得记录在集合中的位置
Itarator companysInCollection =
context.iterate("companysInCollection [position() > 3]");
2、按指定的规则获取
//实例化Association类
Association association = new Association();
//实例化JXPath上下文
JXPathContext context = JXPathContext.newContext(association);
//获得数组中对象的name属性为'name3'的所有对象
//iterator方法的参数companysInArray [name='name3']使用了XPath的语法
//其中的companysInArray是Association对象的属性,他是一个数组
//name='name3'是条件表达式,表示返回对象的name属性值必须是name3
Itarator companysInArray =
context.iterate("companysInArray [name='name3']");
//获得集合中对象的name属性为'name2'的所有对象
//iterator方法的参数companysInCollection [name='name3']使用了XPath的语法
//其中的companysInCollection是Association对象的属性
//他是一个Collection类型或者是其子类型的一个实例
//name='name3'是条件表达式,表示返回对象的name属性值必须是name3
Itarator companysInCollection =
context.iterate("companysInCollection [name='name3']");
3.4 访问Map对象的内容
1、准备符合条件的java类
package org.vivianj.jxpath.examples.pub;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.jxpath.JXPathContext;
public class MyMapSource {
private Map map = new HashMap();
public MyMapSource(){
map.put("id",new Integer(5));
map.put("name","name");
}
public Map getMapSource(){
return this.map;
}
}
2、使用JXPath访问Map的内容
//实例化MyMapSource对象
MyMapSource myMapSource = new MyMapSource();
//实例化JXPath上下文
JXPathContext context = JXPathContext.newContext(myMapSource);
//通过JXPath访问Map对象的内容
// getValue方法的参数使用了XPath语法
// mapSource/id中的mapSource表示MyMapSource对象的属性,
//他是一个Map类型的对象,id表示获取该Map对象的id字段
Integer id = (Integer) context.getValue("mapSource/id");
3.5 访问XML文件
1、编写自己的XML文件
sun
18 #,WenShan Road
ibm
18 #,WenEr Road
2、编写一个类,返回符合条件的company内容
package org.vivianj.jxpath.examples.pub;
import java.net.URL;
import org.apache.commons.jxpath.Container;
import org.apache.commons.jxpath.xml.DocumentContainer;
public class Companys {
private Container companys = null;
public Container getCompanys(){
if (companys == null){
//获取XML文件的内容
URL url = getClass().getResource("companys.xml");
//将XML的内容绑定到companys对象
companys = new DocumentContainer(url);
}
return companys;
}
}
3、使用JXPath访问XML文件的内容
//实例化Companys对象
Companys companys = new Companys();
//初始化JXPath上下文
JXPathContext context = JXPathContext.newContext(companys);
//获得指定记录的子元素的内容
/*getValue方法的参数
"companys/companys/company[@id = '101']/address/street"
使用了XPath语法
其中的第一个companys表示访问Companys对象的companys属性
第二个companys表示访问XML数据中的companys元素
company、address、street都是xml中的元素的名字
@id = '101'是一个条件表达式,表示符合条件的company元素的id属性必须是101
*/
String street = (String)context.getValue(
"companys/companys/company[@id = '101']/address/street");
//通过JXPath获取xml元素的属性的值
logger.debug("id=" +
context.getValue("companys/companys/company[@id = '101']/@id"));
//通过JXPath获取xml元素的子元素的值
logger.debug("p_id=" +
context.getValue("companys/companys/company[name = 'sun']/name"));
[注] 通过JXPath访问xml内容时,如果访问属性,必须增加一个@符号,以示区别
四、总结
JXPath是apache组织提供的一个XPath的java实现,目前最新的版本是1.3,通过JXPath提供的丰富的类库,使用者可以很简单的使用XPath语法来访问java对象、集合、xml内容、web应用环境下的各种对象等。
本文中作者一开始简单的介绍了JXPath的相关信息,接下来的章节中,作者结合实例,详细的演示了如何通过JXPath提供的丰富的类库访问java对
象、集合和XML文件的详细过程,同时给出了简单的注释,希望能够帮助大家进入JXPath的精彩世界。JXPath的强大功能远不止此,请大家关注.
分享到:
相关推荐
"jxpath"则代表Java XPath API,这是一个用于在Java对象模型(如JavaBeans或XML DOM)中导航的库,它使用XPath表达式来查找、修改和评估节点。 **Apache Commons JXPath** Apache Commons JXPath是Apache Commons...
5. **commons-jxpath-1.3.jar**: JXPath 是一种基于 XPath 的 API,用于在 Java 对象树中导航,可以方便地获取和设置对象属性,特别适用于 XML 数据的操作和解析。 6. **commons-configuration-1.6.jar**: 提供了...
在描述中提到的博客链接可能涵盖了如何在Java环境中配置和使用jqGrid的具体步骤,但链接无法直接访问,因此这里将提供一个简化的示例流程: 1. **引入jqGrid库**:在HTML页面中引入jqGrid的CSS和JavaScript文件,...
fastutil库是针对Java集合框架的扩展,它提供了小内存占用和快速访问的特定类型的集合类,如map、set、list和queue,也包括大(64位)array、set和list,以及快速、实用的二进制文件和文本文件的I/O类。fastutil特别...
这两个组件结合使用,可以高效地实现XML数据的读取、写入和转换,特别是在XML与Java对象之间的双向转换场景中。 ### 6. 数据验证:Validator模块 Validator模块提供了一套完整的数据验证解决方案,支持自定义验证...
3. **Apache Commons Collections**: 提供了对Java集合框架的扩展,如更强大的列表、映射和队列实现,以及数据结构和算法。 4. **Apache Commons Net**: 实现了多种网络协议,如FTP、SMTP、NNTP等,便于进行网络...
它包括对Java集合框架的增强,例如工厂模式、迭代器工厂、比较器和转换器。 2. **sanselan-0.97-incubator.jar**:Apache Commons Sanselan是一个用于读取、写入和处理多种图像格式(如JPEG、GIF、PNG)的库,处于...
16. **JXPath**:提供了使用 XPath 语法操作 JavaBeans 的工具,支持 Java 对象的各种导航和修改。 17. **Lang** 包:包含了很多通用工具类,补充了 `java.lang` 包的功能,如字符串操作、数组处理、日期时间操作等...
commons-digester XML 文件到 Java 对象的映射机制 commons-discovery 提供工具来定位资源 (包括类) ,通过使用各种模式来映射服务/引用名称和资源名称。 commons-el 提供在JSP2.0规范中定义的EL表达式的解释器. ...
commons-digester XML 文件到 Java 对象的映射机制 commons-discovery 提供工具来定位资源 (包括类) ,通过使用各种模式来映射服务/引用名称和资源名称。 commons-el 提供在JSP2.0规范中定义的EL表达式的解释器. ...
18. **JXPath**: Commons-JXPath允许使用XPath语法来操作JavaBeans和其他对象,提供了强大的数据导航能力。 19. **Lang**: Commons-Lang提供了许多对`java.lang`包中类的扩展,包括字符串处理、日期时间操作、数组...
10. **Apache Commons JXPath**: 提供了XML和Java对象之间的导航机制,类似于XPath在XML文档中的作用,使得在Java对象树中查找和修改数据变得简单。 以上只是Apache Commons中一小部分工具的概述,实际上,这个项目...
12. **Commons Digester**: 使用 XML 配置文件映射到 Java 对象,简化 XML 解析和对象创建过程。 13. **Commons Discovery**: 提供工具定位资源,通过模式匹配服务/引用名称和资源名称。 14. **Commons EL**: 提供...
- **JXPath**:使用XPath表达式在Java对象模型(如Map和JavaBean)中导航和修改数据。 3. **工具组件**: - **BeanUtils**:提供JavaBean属性的便捷操作,如复制属性、反射调用方法。 - **Logging**:提供了一种...
3. **Commons Collections**: 为Java集合框架提供了一系列的增强和扩展,包括集合工厂、迭代器工具、集合排序和转换等功能。 4. **Commons BeanUtils**: 提供了对JavaBean属性操作的简单封装,可以方便地进行属性的...
11. **Commons JXPath**:通过路径表达式在 Java 对象图中导航,类似于 XPath 在 XML 文档中的作用。 这些组件的设计遵循了 SOLID 原则,具有良好的API设计和文档,易于理解和使用。通过引入 Apache Commons 包,...
1. **Apache Commons Lang**: 这个模块提供了许多高级字符串和对象处理方法,如创建对象实例、类型转换、日期时间操作等。它还包含了一些实用工具类,如StringUtils、ArrayUtils和ClassUtils。 2. **Apache Commons...
10. **Commons JXPath**: 提供了基于 XPath 的 Java 对象导航,可以方便地从复杂对象模型中提取信息。 11. **Commons DBCP / DBCP2**: 提供数据库连接池服务,优化了数据库资源的管理和复用,提高了应用的性能。 ...
1. **Apache Commons Lang**: 这是 Commons 项目中最常用的一个子项目,提供了一系列高级的字符串和对象操作工具,如创建UUID、字符串格式化、比较、分割、替换等。此外,Lang 包含了一些通用的实用方法,用于处理类...