- 浏览: 565324 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (267)
- 随笔 (4)
- Spring (13)
- Java (61)
- HTTP (3)
- Windows (1)
- CI(Continuous Integration) (3)
- Dozer (1)
- Apache (11)
- DB (7)
- Architecture (41)
- Design Patterns (11)
- Test (5)
- Agile (1)
- ORM (3)
- PMP (2)
- ESB (2)
- Maven (5)
- IDE (1)
- Camel (1)
- Webservice (3)
- MySQL (6)
- CentOS (14)
- Linux (19)
- BI (3)
- RPC (2)
- Cluster (9)
- NoSQL (7)
- Oracle (25)
- Loadbalance (7)
- Web (5)
- tomcat (1)
- freemarker (1)
- 制造 (0)
最新评论
-
panamera:
如果设置了连接需要密码,Dynamic Broker-Clus ...
ActiveMQ 集群配置 -
panamera:
请问你的最后一种模式Broker-C节点是不是应该也要修改持久 ...
ActiveMQ 集群配置 -
maosheng:
longshao_feng 写道楼主使用 文件共享 模式的ma ...
ActiveMQ 集群配置 -
longshao_feng:
楼主使用 文件共享 模式的master-slave,produ ...
ActiveMQ 集群配置 -
tanglanwen:
感触很深,必定谨记!
少走弯路的十条忠告
为了演示的目的,我们采取了一个相对简单的模型:一个公司有多个部门,一个部门有多个员工,下面是模型图:
执行简单的JXPath 查询:
最简单的查询就是从对象树中查找一个对象,例如,要查找公司,用下面的代码:
JXPathContext context = JXPathContext.newContext(company);
Company c = (Company)context.getValue(".");
第一行展示了context (上下文)的创建,也就是对象树中所有JXPath的xpath 规则的起始点(相当于XML文档的根节点元素)。
第二行执行了实际的查询,因为这里的上下文是以公司开始的,所以要获取公司对象,只需要使用当前元素选择器“.”。
使用谓词和变量
一个员工是部门的子对象,获取员工名为johnny 的代码如下:
Employee emp = (Employee)context.getValue("/departmentList/employees[name='Johnny']");
这段代码可以这样理解:遍历所有的部门寻找姓名为johnny的员工
上面的代码段解释了如何使用谓词进行对象的搜索,使用谓词相当于SQL语句中的where字句,我们可以绑定多条谓词:
Employee emp = (Employee)context.getValue("/departmentList/employees[name='Susan' and age=27]");
如果你不是只进行一次查询的话,像上面这样的硬编码一般都不可取,更好的方法是定义一个可重用的查询,那么你就可以在多条语句中进行重用,为适应参数化的查询JXPath 支持变量查询,代码如下:
context.getVariables().declareVariable("name", "Susan");
context.getVariables().declareVariable("age", new Integer(27));
Employee emp = (Employee)context.getValue("/departmentList/employees[name=$name and age=$age]");
对于集合元素的迭代
JXPath 提供了一个迭代器,可以对查询的结果进行迭代,下面的代码:
for(Iterator iter = context.iterate("/departmentList");iter.hasNext();)
...
{
Department d = (Department)iter.next();
//...
}
迭代所有员工的代码如下:
for(Iterator iter = context.iterate("/departmentList/employees"); iter.hasNext();)
...
{
Employee emp = (Employee)iter.next();
//...
}
下面是一个结合变量绑定和迭代的例子:
context.getVariables().declareVariable("deptName", "Sales");
context.getVariables().declareVariable("minAge", new Integer(30));
for(Iterator iter = context.iterate("/departmentList
[name=$deptName]/employees[age>$minAge]"); iter.hasNext();)
{
Employee emp = (Employee)iter.next();
//
}
指针 Pointers
指针是JXPath的一个工具类,用来代表对象树中的一个对象的引用,比如,一个指针可能代表了第二个部门的第一个员工,相比于直接从对象树中查找对象的对象,指针提供了一些额外的功能,比如在相关上下文下的相关查询,下面有具体的例子:
使用指针
使用指针指向一个对象和从对象树中获取一个对象是相等的:
JXPathContext context = JXPathContext.newContext(company);
Pointer empPtr = context.getPointer("/departmentList[name='Sales']/employees[age>40]");
System.out.println(empPtr);
//output: /departmentList[1]/employees[1]
System.out.println(((Employee)empPtr.getValue()).getName());
//output: Johnny
可以看出,一个指针只是代表了一个对象的位置,而不是对象本身,同时也可以看出,可以通过指针的getValue方法获取指针代表的对象。
相关上下文下的相关查询由于指针是代表对象的位置,所以可以被用来作为整个对象树来导航的一个引用,为了做到这点,我们可以把指针指向根对象(就好像上面例子中的公司对象),也就是所谓的相关上下文,在相关上下文,你可以通过相关查询进行整个对象树的查询,指针的这个高级使用提供了极大的弹性,下面我们例子说明:
开始,我们来创建一个相关上下文:
for(Iterator iter = context.iteratePointers("/departmentList[name='Sales']/employees[age>30]"); iter.hasNext();)
{
Pointer empPtr = (Pointer)iter.next();
JXPathContext relativeContext = context.getRelativeContext(empPtr);
}
使用相关上下文,XPath 查询能够在对象树的子节点,父节点,超父节点等进行执行,具体看下面的例子:
//Current employee
Employee emp = (Employee)relativeContext.getValue(".");
//Employee name
String name = (String)relativeContext.getValue("./name");
//Name of the Department this Employee belongs to (a parent object)
String deptName = (String)relativeContext.getValue("../name");
//Name of the Company this Employee belongs to (a 'grandparent' object)
String compName = (String)relativeContext.getValue("../../name");
//All coworkers of this Employee (sibling objects)
for(Iterator empIter = relativeContext.iterate("../employees"); empIter.hasNext();){
Employee colleague = (Employee)empIter.next();
//
}
总结
JXPath 在遍历,导航,和查询复杂的对象树时是非常有用的工具,由于它使用 xpath 语言 进行查询,因此有大量的资料可以帮助构建高效的复杂对象树查询,指针和相关上下文的加入使得查询更加方便。
执行简单的JXPath 查询:
最简单的查询就是从对象树中查找一个对象,例如,要查找公司,用下面的代码:
JXPathContext context = JXPathContext.newContext(company);
Company c = (Company)context.getValue(".");
第一行展示了context (上下文)的创建,也就是对象树中所有JXPath的xpath 规则的起始点(相当于XML文档的根节点元素)。
第二行执行了实际的查询,因为这里的上下文是以公司开始的,所以要获取公司对象,只需要使用当前元素选择器“.”。
使用谓词和变量
一个员工是部门的子对象,获取员工名为johnny 的代码如下:
Employee emp = (Employee)context.getValue("/departmentList/employees[name='Johnny']");
这段代码可以这样理解:遍历所有的部门寻找姓名为johnny的员工
上面的代码段解释了如何使用谓词进行对象的搜索,使用谓词相当于SQL语句中的where字句,我们可以绑定多条谓词:
Employee emp = (Employee)context.getValue("/departmentList/employees[name='Susan' and age=27]");
如果你不是只进行一次查询的话,像上面这样的硬编码一般都不可取,更好的方法是定义一个可重用的查询,那么你就可以在多条语句中进行重用,为适应参数化的查询JXPath 支持变量查询,代码如下:
context.getVariables().declareVariable("name", "Susan");
context.getVariables().declareVariable("age", new Integer(27));
Employee emp = (Employee)context.getValue("/departmentList/employees[name=$name and age=$age]");
对于集合元素的迭代
JXPath 提供了一个迭代器,可以对查询的结果进行迭代,下面的代码:
for(Iterator iter = context.iterate("/departmentList");iter.hasNext();)
...
{
Department d = (Department)iter.next();
//...
}
迭代所有员工的代码如下:
for(Iterator iter = context.iterate("/departmentList/employees"); iter.hasNext();)
...
{
Employee emp = (Employee)iter.next();
//...
}
下面是一个结合变量绑定和迭代的例子:
context.getVariables().declareVariable("deptName", "Sales");
context.getVariables().declareVariable("minAge", new Integer(30));
for(Iterator iter = context.iterate("/departmentList
[name=$deptName]/employees[age>$minAge]"); iter.hasNext();)
{
Employee emp = (Employee)iter.next();
//
}
指针 Pointers
指针是JXPath的一个工具类,用来代表对象树中的一个对象的引用,比如,一个指针可能代表了第二个部门的第一个员工,相比于直接从对象树中查找对象的对象,指针提供了一些额外的功能,比如在相关上下文下的相关查询,下面有具体的例子:
使用指针
使用指针指向一个对象和从对象树中获取一个对象是相等的:
JXPathContext context = JXPathContext.newContext(company);
Pointer empPtr = context.getPointer("/departmentList[name='Sales']/employees[age>40]");
System.out.println(empPtr);
//output: /departmentList[1]/employees[1]
System.out.println(((Employee)empPtr.getValue()).getName());
//output: Johnny
可以看出,一个指针只是代表了一个对象的位置,而不是对象本身,同时也可以看出,可以通过指针的getValue方法获取指针代表的对象。
相关上下文下的相关查询由于指针是代表对象的位置,所以可以被用来作为整个对象树来导航的一个引用,为了做到这点,我们可以把指针指向根对象(就好像上面例子中的公司对象),也就是所谓的相关上下文,在相关上下文,你可以通过相关查询进行整个对象树的查询,指针的这个高级使用提供了极大的弹性,下面我们例子说明:
开始,我们来创建一个相关上下文:
for(Iterator iter = context.iteratePointers("/departmentList[name='Sales']/employees[age>30]"); iter.hasNext();)
{
Pointer empPtr = (Pointer)iter.next();
JXPathContext relativeContext = context.getRelativeContext(empPtr);
}
使用相关上下文,XPath 查询能够在对象树的子节点,父节点,超父节点等进行执行,具体看下面的例子:
//Current employee
Employee emp = (Employee)relativeContext.getValue(".");
//Employee name
String name = (String)relativeContext.getValue("./name");
//Name of the Department this Employee belongs to (a parent object)
String deptName = (String)relativeContext.getValue("../name");
//Name of the Company this Employee belongs to (a 'grandparent' object)
String compName = (String)relativeContext.getValue("../../name");
//All coworkers of this Employee (sibling objects)
for(Iterator empIter = relativeContext.iterate("../employees"); empIter.hasNext();){
Employee colleague = (Employee)empIter.next();
//
}
总结
JXPath 在遍历,导航,和查询复杂的对象树时是非常有用的工具,由于它使用 xpath 语言 进行查询,因此有大量的资料可以帮助构建高效的复杂对象树查询,指针和相关上下文的加入使得查询更加方便。
发表评论
-
java 类的加载 以及 ClassLoader
2020-04-16 09:43 446Class Loader 类加载器: 类加载器负责加载 ... -
Stack 的实现原理深入剖析
2020-04-06 13:26 486Stack 介绍: Stack是栈。 ... -
Vector 的实现原理深入剖析
2020-04-06 13:17 363Vector介绍: Vector 是矢量队列,它是JDK1. ... -
JDK 分析工具
2020-04-05 17:30 362常用分析工具: jps:显示指定系统中所有的HotSpot虚 ... -
二叉树的深度优先遍历和广度优先遍历
2020-03-10 09:33 594概述: 1、深度优先遍历(Depth-First-Sear ... -
Hashtable 的实现原理深入剖析
2020-02-18 20:59 529一、Hashtable的基本方法: 1、定义: HashT ... -
jdk 1.8 新特性
2020-02-17 13:43 3611、default关键字 ... -
Java IO 架构
2019-11-11 16:39 350主要两类: 磁盘I/O 网络I/O 基于字节 ... -
Java 数据结构与算法
2019-04-03 10:25 516程序=数据结构+算法 ... -
Java语言异常(Exception)
2018-10-09 11:40 548异常,是Java中非常常用 ... -
Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
2018-08-17 09:47 1469首先介绍一些乐观锁与 ... -
Java 高性能编程注意事项
2016-11-17 09:55 6451. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担, ... -
Netty 解析
2017-03-07 13:47 1220Linux网络IO模型: Linux ... -
2016年Java 面试题总结
2016-01-18 13:34 54792多线程、并发及线程的基础问题: 1)Java 中能创建 vo ... -
java 内存模型
2015-12-29 13:44 816JAVA内存模型: Java内存 ... -
JVM 深入剖析
2015-12-29 12:51 1091JVM是JAVA虚拟机(JAVA Virtual Machin ... -
Java 并发编程_Synchronized
2015-12-16 12:42 870硬件的效率和一致性: 由于计算机的运算速度和它的存储和通讯子 ... -
Java 并发编程_Volatile
2015-12-15 13:42 618术语定义: 共享变量:在多个线程之间能够被共享的变量被称为共 ... -
Java 并发编程_ConcurrentLinkedQueue
2015-12-15 13:32 907ConcurrentLinkedQueue 的分析和使用: ... -
Java 并发编程_ConcurrentHashMap
2015-11-10 11:30 829ConcurrentHashMap 的分析和 ...
相关推荐
通过使用JXPath,开发者可以方便地遍历和操作Java对象的属性,就如同在XML文档中使用XPath查询元素一样。 **二、JXPath工作原理** JXPath的工作原理基于Java反射API,它可以解析Java对象的结构,并根据指定的路径...
"jxpath"则代表Java XPath API,这是一个用于在Java对象模型(如JavaBeans或XML DOM)中导航的库,它使用XPath表达式来查找、修改和评估节点。 **Apache Commons JXPath** Apache Commons JXPath是Apache Commons...
jxpath jar包 JXPATH是通过简单的表达式,可以在JAVA的类对象层次中进行查询
jar包,亲测可用
jar包,亲测可用
Commons-JXPath 提供了使用Xpath语法操纵符合Java类命名规范的 JavaBeans的工具。也支持 maps, DOM 和其他对象模型。. Lang Commons-Lang 提供了许多许多通用的工具类集,提供了一些java.lang中类的扩展功能 Latka...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
离线安装包,测试可用
离线安装包,亲测可用
5. **commons-jxpath-1.3.jar**: JXPath 是一种基于 XPath 的 API,用于在 Java 对象树中导航,可以方便地获取和设置对象属性,特别适用于 XML 数据的操作和解析。 6. **commons-configuration-1.6.jar**: 提供了...
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用