2011-11-09 71 views
1

我剛開始嘗試使用Jaxp13XPathTemplate,但在解析XML時我有點困惑。使用XPATH在Java中解析XML節點

下面是示例XML

<fxDataSets> 
<fxDataSet name="NAME_A"> 
    <link rel="self" href="http://localhost:8080/linkA"/> 
    <baseCurrency>EUR</baseCurrency> 
    <description>TEST DESCRIPTION A</description> 
</fxDataSet> 

<fxDataSet name="NAME_B"> 
    <link rel="self" href="http://localhost:8080/linkB"/> 
    <baseCurrency>EUR</baseCurrency> 
    <description>TEST DESCRIPTION B</description> 
</fxDataSet> 
<fxDataSets> 

我已經能夠得到NAME_A和NAME_B但是我不能夠得到描述兩個節點。

這是我想出來的。

XPathOperations xpathTemplate = new Jaxp13XPathTemplate(); 
    String fxRateURL = "http://localhost:8080/rate/datasets"; 
    RestTemplate restTemplate = new RestTemplate(); 
    Source fxRate = restTemplate.getForObject(fxRateURL,Source.class); 
    List<Map<String, Object>> currencyList = xpathTemplate.evaluate("//fxDataSet", fxRate , new NodeMapper() { 
     public Object mapNode(Node node, int i) throws DOMException 
     { 
      Map<String, Object> singleFXMap = new HashMap<String, Object>(); 
      Element fxDataSet = (Element) node; 
      String id = fxDataSet.getAttribute("name"); 

      /* This part is not working 
      if(fxDataSet.hasChildNodes()) 
      { 
       NodeList nodeList = fxDataSet.getChildNodes(); 
       int length = nodeList.getLength(); 

       for(int index=0;i<length;i++) 
       { 
        Node childNode = nodeList.item(index); 
        System.out.println("childNode name"+childNode.getLocalName()+":"+childNode.getNodeValue()); 
       } 

      }*/ 

      return new Object(); 
     } 
    }); 

回答

1

嘗試使用dom4j庫和它的saxReader。

InputStream is = FileUtils.class.getResourceAsStream("file.xml"); 

    SAXReader reader = new SAXReader(); 
    org.dom4j.Document doc = reader.read(is); 
    is.close(); 
    Element content = doc.getRootElement(); //this will return the root element in your xml file 
    List<Element> methodEls = content.elements("element"); // this will retun List of all Elements with name "element" 
+0

喜Ademiban,我已經得到了元素了。這裏的問題是如何獲取描述標記值,而不是獲取元素。 – Rudy

1

看看public <T> List<T> evaluate(String expression, Source context, NodeMapper<T> nodeMapper)

  • evaluate需要NodeMapper<T>作爲它的參數之一
  • 它返回一個類型的對象List<T>

但你給出的代碼片段:

  • 其通過new NodeMapper()作爲參數
  • 但試圖返回List<Map<String, Object>>這肯定是違反api的合同。

可能的解決方案:

我假設你想返回FxDataSet型它包裝<fxDataSet>...</fxDataSet>元素的對象。如果是這種情況,

  • 通參數作爲new NodeMapper<FxDataSet>()作爲參數
  • 使用List<FxDataSet> currencyList = ...如左手側表達;
  • 更改方法返回類型爲public FxDataSet mapNode(Node node, int i) throws DOMException

查看NodeMapper的文檔。

當然,我沒有使用Jaxp13XPathTemplate,但這應該是通用的Java概念,它幫助我找出實際上哪裏出了錯。我希望這個解決方案能夠工作。

0

如果你想在fxDataSet元素的子節點,你應該能夠做到:

Node descriptionNode= fxDataSet.getElementsByTagName("description").item(0);