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

在这个BaseDomain类中,我有一个字段,它是公共的最终String名称。

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,因为我最终将进行更深入的搜索。例如:行程可能包含一个位置列表,这也扩展了BaseDomain。每个位置可以保存一个扩展BaseDomain的PointOfInterest列表。

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

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

据我了解,还没有办法编写一个jxpath查询来根据对象的类型,类名等来查找对象列表。

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

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

最终,我想创建一个基于行程的jxpath查询,该迭代器返回一个迭代器,该迭代器的任意深度都是BaseDomain实例的任意深度,并且不依赖于节点位于对象树中的哪个分支,只要我可以获取我要查找的对象的类名。

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

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

和以前一样,我非常感谢您的帮助。

最佳答案

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

 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 manual之后,为什么不尝试以下操作:
String name = (String)jxPathContext.getValue("/Trip/../@name");
// or use "../@name", not sure it wouldn't need to be "/../@name"

10-06 09:20