【问题标题】:Getting a specific value from an XML file using XPath使用 XPath 从 XML 文件中获取特定值
【发布时间】:2012-08-01 19:47:23
【问题描述】:

所以我在这里有一个 XML 文件,我想使用 XPath 从中获取一个值。有问题的文件是一个 zip 格式的 XML 文件,您可以下载 here:

我相信它是有效的 XML。

我当前的目标是解析出文档中的 last(最新)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] 对我来说一直是一个困惑的领域,所以我几乎对每个号码都进行了尝试,但都没有成功。

【问题讨论】:

    标签: java xml parsing xpath


    【解决方案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());
    

    【讨论】:

    • 使用上面的代码后跟 System.out.println() 我没有从您发布的代码中得到任何东西。 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 /文本()”) ;字符串结果 = (String) expr.evaluate(doc, XPathConstants.STRING); System.out.println("最后一个值:" + 结果) ;
    • 已编辑答案以包括命名空间解析。如果您希望它比我放在那里的更复杂,请参阅ibm.com/developerworks/java/library/x-nmspccontext/index.html
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2015-11-27
    • 2022-01-04
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多