我有几个域类都继承了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实现此目的?
欢迎并赞赏代码示例,博客链接或其他文档。
和以前一样,我非常感谢任何帮助。
答案 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"