【问题标题】:xpath group by "name" fieldxpath 按“名称”字段分组
【发布时间】:2016-07-19 07:51:14
【问题描述】:

我有一个 XML,它是一个事件阈值列表,我想在阈值的“名称”上获取此数据绑定,因此我可以获取特定“命名”事件阈值的关联键和值。

非工作代码:

      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>

对于输出,我正在尝试迭代事件阈值,然后将“名称”与值一起作为 JSON 对象发送。例如

{
    "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

所以除了调用 getTextContent() 时,我似乎从未获得过“名称”属性。

【问题讨论】:

    标签: java xml xpath


    【解决方案1】:

    您的 XPath 查询应该类似于 event/event-thresholds[name],您将获得event-thresholds 节点。

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

    【讨论】:

    • 进度,但我不知道如何通过它的keyName获取“name”键值。因为我不能假设 firstChild 永远是名字?
    • 您需要遍历子节点并查找所需的节点('name'、'set-value'、...)。
    • 我在上面添加了一些更新,即使在迭代元素时,除了包含所有内容的 getTextContent() 之外,它们都不包含“名称”。
    【解决方案2】:
    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());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 2022-01-14
      • 2018-08-08
      • 1970-01-01
      相关资源
      最近更新 更多