超类中的jXPath查询属性

时间:2013-02-12 16:12:16

标签: java inheritance attributes jxpath

我有几个域类都继承了BaseDomain类。

在这个BaseDomain类中,我有一个公共最终字符串名称字段;

name的值在构造函数中设置。

public class BaseDomain {
    public final String name;
    public BaseDomain() {
    this.name = this.getClass().getCanonicalName();
    }
}

此BaseDomain扩展了几个类

public class Trip extends BaseDomain {
    private int id;
    public Trip(int id){
        this.id = id;
    }

}

到目前为止一切顺利。

我希望在JXPath的帮助下在Trip的对象实例中获取字段“name”的值,但不能。我可以访问“id”字段,但不能访问“name”字段。

JXPathContext jxPathContext = JXPathContext.newContext(trip);
jxPathContext.setLenient(true);
int id = (int)jxPathContext.getValue("/@id"); // This works. 
String name = (String)jxPathContext.getValue("/@name"); // This does not work. 

是否可以使用此设置和JXPath获取“name”的值?

代码可能有一些语法错误和/或其他错误。我希望你们都能理解并理解我的问题。

欢迎任何帮助或指针。

首先:我要感谢Kelly S. French的快速重播。 这让我意识到我还需要解释一些。

我想使用jxpath,因为我最终会进行更深入的搜索。例如:Trip可能包含一个Locations列表,它也扩展了BaseDomain。每个位置都可以包含一个扩展BaseDomain的PointOfInterest列表。

通过代码其他部分的反射,我希望能够根据类型获取BaseDomain列表(class.getCanonicalName())

对象树不是基于xml,它是纯粹的POJO。

据我所知,没有办法编写jxpath-query来根据类型,类名等查找对象列表。

这是对的吗? 有人知道这样做的方法吗?

最简单的方法,即使它很难看,也就是在超类中拥有一个包含类名的字段。这就是为什么我做了这个丑陋的解决方案。

最终我想创建一个基于行程的jxpath查询返回一个迭代器,该迭代器的任何对象都是任何深度的BaseDomain实例,并且不依赖于节点所在的对象树中的哪个分支,因为我可以得到我正在寻找的对象的类名。

是否有人知道是否可以使用jxpath-query实现此目的?

欢迎并赞赏代码示例,博客链接或其他文档。

和以前一样,我非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果您有旅行实例,为什么不能这样做

 string n = trip.name;

我可以看到你有一个旅行的XML表示,但是当你只有“旅行”的XML时,使用XPath就是这样。

如果仍需要使用XPath获取名称,请发布生成的XML。我愿意打赌name属性不是Trip的一部分,而是封闭BaseDomain的一部分。如果您将Trip上的jxPathContext作为基础,那么您已经传递了BaseDomain的节点。您必须以某种方式向上导航(如node.parent)或在创建上下文时执行此操作,

// not sure about this approach
JXPathContext jxPathContext = JXPathContext.newContext(trip.super); 

在查看父/子关系的JXPath manual之后,为什么不试试这个:

String name = (String)jxPathContext.getValue("/Trip/../@name");    
// or use "../@name", not sure it wouldn't need to be "/../@name"