代码之家  ›  专栏  ›  技术社区  ›  Yevgeny Simkin

有没有一种方法可以在不发生这种难看的翻腾的情况下使用xpath获得节点值?

  •  0
  • Yevgeny Simkin  · 技术社区  · 15 年前

    这是一个Java问题,BTW.

    我使用的是xpath,一切都很好,直到最后一点我看到我所寻找的节点集,我需要做一个非常难看的评估,看看我所处理的节点是元素还是文本类型,然后才能得到它的值。我在想,是否有一个方法,沿着我在下面写的方法,可以得到我的价值。

    XPathExpression expr = inFeed.getXpath().compile(xPathEx);
    Object result = expr.evaluate( rootNode, XPathConstants.NODESET);
    NodeList nodeList = (NodeList)result;
    ret = "";
    for(int i = 0; i< nodeList.getLength() ; i++){
        ret += getNodeValue(nodeList.item(i)) + ",";
    }
    

    所以…看到getNodeValue()方法了吗?它将获取该节点内的字符串,如果该节点恰好不是文本类型,它将查找子节点,当它找到文本节点时,它将返回该字符串。

    必须有一种节点本机方式来实现我所忽略的这一点,对吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Yevgeny Simkin    15 年前

    呸!就在那里…node.getTextContent()。 <roseanne-roseannadanna> nevermind! </roseanne-roseannadanna>

        2
  •  1
  •   Drew Wills    15 年前

    使用dom4j,你可以非常简单地…

    import org.dom4j.Document;
    import org.dom4j.io.SAXReader;
    
    SAXReader reader = new SAXReader();
    Document doc = reader.read('example.xml');
    StringBuilder ret = new StringBuilder();
    for (Node n : doc.selectNodes('//book')) {
      if (ret.length() > 0) {
        ret.append(", ");
      }
      ret.append(n.getText());
    }
    
    println ret.toString();
    

    (注意:语法是Groovy,但它在Java中是一样的。)

    selectnodes()方法采用xpath表达式。getText()方法返回节点的所有文本内容,包括其子节点。