我有几个领域类,它们都继承了一个 BaseDomain 类。
在这个 BaseDomain 类中,我有一个字段是 public final String name;
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 的帮助下获取 a 的 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。每个 Location 都可以包含一个扩展 BaseDomain 的 PointOfInterest 列表。
通过在代码的其他部分进行反射,我希望能够根据它们的类型 (class.getCanonicalName()) 获取 BaseDomain 列表
对象树不是基于 xml,它是纯 POJO。
据我所知,没有办法编写 jxpath 查询来根据对象的类型、类名等查找对象列表。
这是正确的吗? 有人知道这样做的方法吗?
最简单的方法,即使它很丑陋,也就是在父类(super class)中有一个字段来保存类名。这就是为什么我做了这个丑陋的解决方案。
最后,我想创建一个 jxpath-query,它基于 trip 返回一个迭代器,该迭代器是任何深度的 BaseDomain 实例的对象,而不取决于节点位于对象树中的哪个分支,只要因为我可以获得我正在寻找的对象的类名。
有谁知道是否可以通过 jxpath-query 实现这一点?
欢迎并赞赏代码示例、博客或其他文档的链接。
和以前一样,我非常感谢任何帮助。
最佳答案
如果你有 trip 实例,你为什么不能这样做
string n = trip.name;
我可以看到您有旅行的 XML 表示,但是当您只有“旅行”的 XML 时,可以使用 XPath。
如果您仍然需要使用 XPath 获取名称,请发布生成的 XML。我愿意打赌名称属性不是 Trip 的一部分,而是封闭的 BaseDomain 的一部分。如果您将 jxPathContext 基于 Trip,则您已经传递了 BaseDomain 的节点。您必须以某种方式返回导航(例如 node.parent)或在创建上下文时执行此操作,
// not sure about this approach
JXPathContext jxPathContext = JXPathContext.newContext(trip.super);
看了JXPath manual之后关于 parent / child 的关系,你为什么不试试这个:
String name = (String)jxPathContext.getValue("/Trip/../@name");
// or use "../@name", not sure it wouldn't need to be "/../@name"
关于java - 父类(super class)中的 jXPath 查询属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14836781/