2013-02-12 49 views
3

我有几个域类都继承了一个BaseDomain类。jXPath超类中的quering属性

在这个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的帮助下在Trip的对象实例中获取字段“name”的值,但不能。我可以访问“ID”字段,但不能访问“名称”字段。

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”的值?

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

欢迎任何帮助或指针。

第一个:我想感谢凯利S.法语的快速重播。这让我意识到,我必须解释一些。

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

在我想根据(class.getCanonicalName()),其类型

对象树不是基于XML来能够得到BaseDomain列表代码的其他部分

通过反射,它是纯POJO。

就我所知,没有办法根据它们的类型,类名等来编写jxpath查询来查找对象列表。

这是正确的吗? 有人知道一种方法吗?

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

最后,我想创建一个基于行程的jxpath查询返回一个迭代器,该对象是任何深度的BaseDomain实例,而不依赖于该节点所在的对象树中的哪个分支,作为只要我可以得到我要找的对象的类名即可。

是否有人知道是否有可能通过jxpath查询来实现这一点?

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

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

回答

0

如果你有一趟情况下,为什么你不能做到这一点

string n = trip.name; 

我可以看到你有旅途的XML表示,但使用XPath将是当你只有XML为'旅行'。

如果您仍然需要使用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" 
+0

感谢您的回复。 我会尝试trip.super解决方案。 你知道在jxpath-query中有没有使用.super的方法? – 2013-02-12 20:59:46

+0

很抱歉,.super解决方案无效。 在编译之前会导致错误,指出“行程无法解析为某种类型”。 – 2013-02-13 07:32:39