2012-08-01 76 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