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] 仅表示匹配的第三个。由于以下原因,您没有得到任何匹配:

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());
于 2012-08-01T19:59:35.430 回答