2011-11-09 47 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);