0

ここにXMLファイルがあり、XPathを使用してそこから値を取得したいと思います。問題のファイルは、ここからダウンロードできるzip形式のXMLファイルです。

有効な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]は私にとって混乱の領域だったので、私はほぼすべての番号でそれを試しましたが、運がありませんでした。

4

1 に答える 1

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()

対処すべきもう 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());
于 2012-08-01T19:59:35.430 に答える