2017-04-25 54 views
0

我發佈一個服務器上的一些CSV輸入文件的,它給了我一個XML文件,它看起來像這樣:獲取值是相同的使用名稱的XPath

<ns0:TransportationEvent xmlns:ns0="http://www.server.com/schemas/TransportationEvent.xsd"> 
<ns0:creationDateTime>2017-04-06</ns0:creationDateTime> 
..... 
..... 
</ns0:TransportationEvent> 

<ns0:TransportationEvent xmlns:ns0="http://www.fedex.com/schemas/TransportationEvent.xsd"> 
<ns0:creationDateTime>2017-04-25</ns0:creationDateTime> 
..... 
..... 
</ns0:TransportationEvent> 

TransportationEvent標籤會一次又一次地添加更新的日期。

我從該XML使用被如下所示的XPathFactory類和NamespaceContext類檢索數據:

NamespaceContext ctx = new NamespaceContext() { 
     public String getNamespaceURI(String prefix) { 
      String uri; 
      if (prefix.equals("ns0")) 
       uri = "http://www.server.com/schemas/TransportationEvent.xsd"; 
      else 
       uri = null; 
      return uri; 
     } 
     public Iterator getPrefixes(String val) { 
      return null; 
     } 
     // Dummy implementation - not used! 
     public String getPrefix(String uri) { 
      return null; 
     } 
    }; 

XPathFactory xpathFact = XPathFactory.newInstance(); 
XPath xpath = xpathFact.newXPath(); 
xpath.setNamespaceContext(ctx); 

String strXpath = "//ns0:TransportationEvent/ns0:creationDateTime/text()";  
String creationDateTime = xpath.evaluate(strXpath, doc); 

上面的代碼給出作爲2017年4月6日creationDateTime的值。基本上它總是取自第一個標記的值。

我需要從挑選數據「TransportationEvent」標籤裏的「creationDateTime」等於今天的日期。

我可以通過使用NodeList類來執行此操作,並且可以遍歷所有「TransportationEvent」標記,但之後我無法使用Xpath或NamespaceContext實現。我發現NodeList類和NamespaceContext類或Xpath類之間沒有連接。

我想要得到的CTX擁有最新的TransportationEvent標籤的背景值。

我知道我錯過了一些東西。請有人幫忙嗎?

回答

0

使用last()功能謂詞只有最後TransportationEvent選擇:

String strXpath = "//ns0:TransportationEvent[last()]/ns0:creationDateTime/text()";  
+0

這個作品就像我想要的。謝謝。 這是使用Namespacecontext和xpathFactory類解析xml的好方法嗎? 我有他們有巨大的內容的XML文件。使用nodeList和節點會使代碼難於管理。我在這裏嗎? – Abhinav

+0

你是正確的軌道上。使用節點方法瀏覽DOM是完全不可讀的,而XPath非常簡短。 – wero