Java 8 Stream API:获取特定节点之后的所有节点

时间:2017-02-17 10:12:38

标签: java dom java-8 java-stream

我有org.w3c.dom.NodeList个5个节点。由UUID.randomUUID();

生成的节点ID

Dom结构:

<section id="3" prefix="s1">
  <paragraph id="value3">
  ...
  </paragraph>
  <paragraph id="value4">
  ...
  </paragraph>
  <paragraph id="value5">
  ...
  </paragraph>
  <paragraph id="value6">
  ...
  </paragraph>
  <paragraph id="value7">
  ...
  </paragraph>
</section>

我需要在节点之后获取属性id =&#34; value5&#34;的所有节点。因此结果应该包含id = value6和id = value7的节点。

我创建了Stream<Element>

NodeList children = element.getChildNodes();
Stream<Element> elementStream = IntStream.range(0, children.getLength())
                                         .mapToObj(children::item)
                                         .filter(Element.class::isInstance)
                                         .map(Element.class::cast);

那么,我能以某种方式使用Java 8 Stream API吗?

2 个答案:

答案 0 :(得分:3)

不幸的是,DOM API与其他API不兼容。我在this earlier answer中提供了一个有用的轻量级List包装器。

有了这个,你可以做到:

List<Node> list = XmlUtil.asList(element.getChildNodes());
list = list.subList(
    list.indexOf(element.getOwnerDocument().getElementById("value5"))+1, list.size());

Stream<Element> stream = list.stream()
    .filter(Element.class::isInstance).map(Element.class::cast);

List<Node> list = XmlUtil.asList(element.getChildNodes());
Stream<Element> stream = IntStream.range(
        list.indexOf(element.getOwnerDocument().getElementById("value5"))+1, list.size())
    .mapToObj(list::get).filter(Element.class::isInstance).map(Element.class::cast);

答案 1 :(得分:2)

你的问题很安静。但是,如果您只需要在具有特定属性的Element之后获取节点并对它们进行排序,则可以尝试按其属性过滤元素:

xx.cloudfront.net/info.html?user=foo