我有几个域类,它们都继承了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"