2017-06-17 51 views
0

我發佈一個服務器上的一些CSV輸入文件的XML文件所需要的數據,它給了我一個XML文件,它看起來像這樣:檢索從具有相同名稱的標籤

<ns0:TransportationEvent xmlns:ns0="http://www.server.com/schemas/TransportationEvent.xsd"> 
<ns0:deviceId>4567289456</ns0:deviceId> 
..... 
..... 
</ns0:TransportationEvent> 

<ns0:TransportationEvent xmlns:ns0="http://www.server.com/schemas/TransportationEvent.xsd"> 
<ns0:deviceId>7965145741</ns0:deviceId> 
..... 
..... 
</ns0:TransportationEvent> 

<ns0:TransportationEvent xmlns:ns0="http://www.server.com/schemas/TransportationEvent.xsd"> 
<ns0:deviceId>2168744654</ns0:deviceId> 
..... 
..... 
</ns0:TransportationEvent> 

TransportationEvent標籤將被添加一次又一次地更新deviceId。

我從該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:deviceId/text()";  
String deviceId = xpath.evaluate(strXpath, doc); 

上面的代碼給出作爲 DEVICEID的值。基本上它總是取自第一個標記的值。

我需要從挑選數據「TransportationEvent」標籤裏的「DEVICEID」等於我選擇的設備ID。事情是這樣的:

String strXpath = "//ns0:TransportationEvent[where ns0:deviceId = " + myDeviceId + "]/ns0:deviceId/text()"; 

我可以通過使用節點列表類執行此,並且可以通過所有的「TransportationEvent」標籤迭代,但隨後我就不能使用XPath或NamespaceContext實施。我發現NodeList類和NamespaceContext類或Xpath類之間沒有連接。

我想要得到的CTX具有所需TransportationEvent標籤的背景值。

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

回答

0

你可以獲取你intrested在這樣的設備ID的父節點: //ns0:deviceId[text()='7965145741']/parent::node()

private static final String NS0_NS = "http://www.server.com/schemas/TransportationEvent.xsd"; 
private static final String NS0 = "ns0"; 
private static final List<String> prefixes = Arrays.asList(NS0); 

public void fromDocument(Document doc) throws XPathExpressionException, TransformerConfigurationException, 
     TransformerFactoryConfigurationError, TransformerException { 

    XPath xpath = XPathFactory.newInstance().newXPath(); 
    xpath.setNamespaceContext(new NamespaceContext() { 

     @Override 
     public Iterator getPrefixes(String namespaceURI) { 
      return prefixes.iterator(); 
     } 

     @Override 
     public String getPrefix(String namespaceURI) { 

      String res = namespaceURI.equals(NS0_NS)?NS0:null; 
      return res; 
     } 

     @Override 
     public String getNamespaceURI(String prefix) { 
      String res = prefix.equals(NS0)?NS0_NS:null; 
      return res; 
     } 
    }); 

    XPathExpression devex = xpath.compile("//ns0:deviceId[text()='7965145741']/parent::node()"); 
    Node node = (Node) devex.evaluate(doc,XPathConstants.NODE); 

    Transformer xformer = TransformerFactory.newInstance().newTransformer(); 
    xformer.transform(new DOMSource(node),new StreamResult(System.out)); 
} 

這是輸出:

<ns0:TransportationEvent xmlns:ns0="http://www.server.com/schemas/TransportationEvent.xsd"> 
     <ns0:deviceId>7965145741</ns0:deviceId> 
    </ns0:TransportationEvent> 
+0

偉大的答案。有什麼方法可以用兩個字段過濾所需的** TransportationEvent **。其中一個字段是_ns0:deviceId_,您已經顯示了該字段,另外還有一個字段,例如_ns0:stopNumber_。 如何添加一個字段(_ns0:stopNumber_)用於在此行中篩選: ** XPathExpression devex = xpath.compile(「// ns0:deviceId [text()='7965145741']/parent :: node )「); ** – Abhinav