Java 具有多个名称空间的JXPath
我需要使用JXPath在JAXB生成的对象上创建一个查询。下面的试用代码生成以下错误:线程main org.apache.commons.jxpath.JXPathNotFoundException中的异常:xpath://p:OrderDetail没有值 Purchase.xml Purchase.java xml文件取自: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
任何能为我指明解决这个问题的正确方向的想法都是可行的吗 由于您是从未编组的对象树构造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()