4

我有几个域类都继承了 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 的对象实例中字段“名称”的值,但不能。我可以访问“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 获取“名称”的值?

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

欢迎任何帮助或指示。

首先:我要感谢 Kelly S. French 的快速回放。这让我意识到我必须解释更多。

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

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

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

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

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

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

最终,我想创建一个基于行程的 jxpath 查询返回一个迭代器,该迭代器是任何深度的 BaseDomain 实例,而不取决于节点位于对象树中的哪个分支,只要我能获取我正在寻找的对象的类名。

有谁知道是否可以通过 jxpath-query 实现这一目标?

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

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

4

1 回答 1

0

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

 string n = trip.name;

我可以看到您有旅行的 XML 表示,但是当您只有“旅行”的 XML 时使用 XPath。

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

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

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

String name = (String)jxPathContext.getValue("/Trip/../@name");    
// or use "../@name", not sure it wouldn't need to be "/../@name"
于 2013-02-12T17:21:19.320 回答