所以我在这里有一个XML文件,我希望使用XPath从中获取一个值。有问题的文件是zip文件中的XML文件,您可以下载here:
我相信它是有效的XML。
我目前的目标是解析文档中的最后(最新)LMP_PRC
值。
我当前的代码如下所示,每次都返回一个空字符串:
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr =
xpath.compile("//m:OASISReport/m:MessagePayload/m:RTO/m:REPORT_ITEM[3]/m:REPORT_DATA[/m:DATA_ITEM='LMP_PRC'][last()]/m:VALUE/text()") ;
String result = (String) expr.evaluate(doc, XPathConstants.STRING);
m:REPORT_ITEM[3]
对我来说一直是一个混乱的领域,所以我几乎每个数字都尝试过它并且没有运气。
答案 0 :(得分:1)
m:REPORT_ITEM [3]仅表示匹配的第3个。由于以下原因,你没有得到任何比赛:
m:REPORT_DATA[/m:DATA_ITEM='LMP_PRC'][last()]
你想要那里的相对路径,而不是绝对路径:
m:REPORT_DATA[m:DATA_ITEM='LMP_PRC'][last()]
所以整个事情看起来像:
//m:OASISReport/m:MessagePayload/m:RTO/m:REPORT_ITEM[3]/m:REPORT_DATA[m:DATA_ITEM='LMP_PRC'][last()]/m:VALUE/text()
要处理的另一件事是命名空间解析。有关您案例中发生的情况的详细摘要,请参阅http://blog.davber.com/2006/09/17/xpath-with-namespaces-in-java/。所以你应该添加如下内容:
private static NamespaceContext getNamespaceContext() {
NamespaceContext namespaceContext = new NamespaceContext() {
public String getNamespaceURI(String prefix) {
String uri = null;
if (prefix == null) {
throw new IllegalArgumentException("No prefix provided!");
} else if(prefix.equals("m")) {
uri = "http://oasis.caiso.com/mrtu-oasis/xsd/OASISReport.xsd";
}
return uri;
}
@SuppressWarnings("rawtypes")
@Override
public Iterator getPrefixes(String namespaceURI) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getPrefix(String namespaceURI) {
// TODO Auto-generated method stub
return null;
}
};
return namespaceContext;
}
然后使用该方法在xpath
对象上设置名称空间上下文:
xpath.setNamespaceContext(getNamespaceContext());