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()
対処すべきもう 1 つのことは、名前空間の解決です。あなたのケースで起こっていることの良い要約については、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());