2012-08-01 36 views
0

因此,我在这里有一个XML文件,我想使用XPath从它获取值。有问题的文件是zip文件中的XML文件,您可以下载here使用XPath从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]已经混乱的区域我,所以我已经与几乎所有数字尝试过了,有没有好运。

回答

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()); 
+0

有了上面的代码,后面是的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/text()“); String result =(String)expr.evaluate(doc,XPathConstants.STRING); System.out.println(“Last value:”+ result); – 2012-08-01 20:09:27

+0

编辑答案以包含名称空间解析。如果您希望它比我放置的更复杂,请参阅http://www.ibm.com/developerworks/java/library/x-nmspccontext/index.html – davidfmatheson 2012-08-02 12:31:11