xpath group by" name"领域

时间:2016-07-19 07:51:15

标签: java xml xpath

我有一个XML,它是一个事件阈值列表,我希望这个数据绑定在" name"阈值,所以我可以获得特定"命名"的关联键和值。事件阈值。

非工作代码:

      NodeList events = (NodeList) xpath.evaluate("event/event-thresholds/name/text()", data, XPathConstants.NODESET);

      for (Node event : asList(events)) {
        logger.info("Event: " + event.getParentNode().getNodeName() + ":" + event.getNodeValue());

        NodeList e2 = (NodeList) xpath.evaluate("event[event-thresholds/@name = " +  event.getNodeValue() + "]/text()", data, XPathConstants.NODESET);
        for (Node e : asList(e2)) {
          logger.info(e.getTextContent());
        }

      }

我有以下XML:

        <event>
        <event-thresholds>
          <name>bind-count</name>
          <set-value>800</set-value>
          <clear-value>600</clear-value>
          <set-percentage>80</set-percentage>
          <clear-percentage>60</clear-percentage>
        </event-thresholds>
        <event-thresholds>
          <name>spool-usage</name>
          <set-value>3200</set-value>
          <clear-value>2400</clear-value>
          <set-percentage>80</set-percentage>
          <clear-percentage>60</clear-percentage>
          </event-thresholds>
        <event-thresholds>
       </event>

对于输出,我试图迭代事件阈值,然后发送&#34;名称&#34;以及作为JSON对象的值。 e.g。

{
    "name": "spool-usage",
    "data": {
        "set-value": 3200,
        "clear-value": 1000,
        ...
    }
}

更新:

      NodeList events = (NodeList) xpath.evaluate("event/event-thresholds[name]", data, XPathConstants.NODESET);

      for (Node event : asList(events)) {
        logger.info(event.getUserData("name"));
        logger.info(event.getFirstChild().getNodeName());
        logger.info(event.getFirstChild().getNodeValue());
        logger.info(event.getNodeName());
        logger.info(event.getNodeValue());
        logger.info(event.getLocalName());
        logger.info(event.getTextContent());
      }

收率:

5983 INFO  com.deblox.smg.QueueHandler:132 - NULL 
5984 INFO  com.deblox.smg.QueueHandler:133 - #text 
5984 INFO  com.deblox.smg.QueueHandler:134 - 

5984 INFO  com.deblox.smg.QueueHandler:135 - event-thresholds 
5984 INFO  com.deblox.smg.QueueHandler:136 - NULL 
5984 INFO  com.deblox.smg.QueueHandler:137 - NULL 
5984 INFO  com.deblox.smg.QueueHandler:138 - 
bind-count
800
600 
80
60

所以我似乎永远不会得到&#34;名字&#34;除了调用getTextContent()时的属性。

2 个答案:

答案 0 :(得分:0)

你的XPath查询应该是这样的 event/event-thresholds[name],您将获得event-thresholds节点。

您可以在此链接上看到示例: http://viralpatel.net/blogs/java-xml-xpath-tutorial-parse-xml/ 见第3.4节

答案 1 :(得分:0)

NodeList nodeList = (NodeList) xPath.compile("//event-thresholds").evaluate(data, XPathConstants.NODESET);

for (int i=0; i<nodeList.getLength(); ++i) {
    Node node = nodeList.item(i);

    NodeList childNodes = node.getChildNodes();
    for (int j=0; j<childNodes.getLength(); ++j) {
        Node child = childNodes.item(j);
        System.out.println(child.getNodeName() + " - " + child.getTextContent());
    }
}