Java 具有多个名称空间的JXPath

Java 具有多个名称空间的JXPath,java,xml,namespaces,jaxb,jxpath,Java,Xml,Namespaces,Jaxb,Jxpath,我需要使用JXPath在JAXB生成的对象上创建一个查询。下面的试用代码生成以下错误:线程main org.apache.commons.jxpath.JXPathNotFoundException中的异常:xpath://p:OrderDetail没有值 Purchase.xml Purchase.java xml文件取自: 任何能为我指明解决这个问题的正确方向的想法都是可行的吗 由于您是从未编组的对象树构造JXPathContext,而不是直接从xml文档或元素构造JXPathContext

我需要使用JXPath在JAXB生成的对象上创建一个查询。下面的试用代码生成以下错误:线程main org.apache.commons.jxpath.JXPathNotFoundException中的异常:xpath://p:OrderDetail没有值

Purchase.xml

Purchase.java

xml文件取自:


任何能为我指明解决这个问题的正确方向的想法都是可行的吗

由于您是从未编组的对象树构造JXPathContext,而不是直接从xml文档或元素构造JXPathContext,因此不必担心名称空间

JXPathContext context = JXPathContext.newContext(purchase);
OrderType orderDetail = (OrderType) context.getValue("orderDetail");
// equivalent to purchase.getOrderDetail()

for(Iterator iter = context.iterate("/orderDetail/items"); iter.hasNext()){
   Item i = (Item) iter.next();
   //...
}
// Assumes that OrderType has a items property
// List<Item> getItems()

您的购买对象是否已正确解组?它是否包含XML数据?另外,您确定CustomerDetails查询的结果应该作为OrderType对象返回吗?如果是,请发布对象树的相关部分?如果以上所有问题的答案都是肯定的,请尝试List CustomerDetails=ctx。选择nodesp:CustomerDetails;jxpath会知道名称空间吗,因为您正在对未经授权的对象结构运行jxpath?@AnthonyAccioly看起来我的购买对象已被正确授权,因为我可以直接调用它并得到结果。但是,通过调用:List jlist=List jctx.selectNodes//p:OrderDetail,我得到了一个空数组;正如你所建议的。还是卡住了。非常感谢您的帮助,安东尼。@UESer我很确定您的购买包含订单详细信息列表。因此,您根本不需要效率低下的//它可以替换为/nameOfYourOrderDetailList。如果您可以发布购买对象的相关部分,包括订单详细信息列表的getter,我们可能会为您提供进一步帮助。@AnthonyAccioly Purchase.getOrderDetail方法返回OrderType对象。关于/,这一点很好,但我尝试了多个xpath查询,但没有成功。如果你需要更多的细节,请告诉我。如果有任何帮助,可以在此处找到xml/xsd文件的详细信息:。
JAXBContext ctx = JAXBContext.newInstance(ObjectFactory.class);
Unmarshaller um = ctx.createUnmarshaller();
Purchase purchase = (Purchase) um.unmarshal(new File("Purchase.xml"));  

JXPathContext jctx = JXPathContext.newContext(purchase);
jctx.registerNamespace("p", "http://NamespaceTest.com/OrderTypes");
OrderType cust = (OrderType) jctx.getValue("//p:OrderDetail");
System.out.println(cust.getItem());
    @XmlRootElement(name = "Purchase")
    public class Purchase {

    @XmlElement(name = "OrderDetail", required = true)
    protected OrderType orderDetail;

    /**
 * Gets the value of the orderDetail property.
 * 
 * @return
 *     possible object is
 *     {@link OrderType }
 *     
 */
public OrderType getOrderDetail() {
    return orderDetail;
}
JXPathContext context = JXPathContext.newContext(purchase);
OrderType orderDetail = (OrderType) context.getValue("orderDetail");
// equivalent to purchase.getOrderDetail()

for(Iterator iter = context.iterate("/orderDetail/items"); iter.hasNext()){
   Item i = (Item) iter.next();
   //...
}
// Assumes that OrderType has a items property
// List<Item> getItems()