当前位置: 首页 > 知识库问答 >
问题:

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

慎星纬
2023-03-14

我有组织。w3c。dom。具有5个节点的节点列表。UUID生成的节点ID。随机UUID()

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=“value5”的节点之后的所有节点。因此,结果应该包含id=value6和id=value7的节点。

我创建了流

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流API来实现这一点吗?

共有3个答案

卜飞鸣
2023-03-14

我们决定对此任务使用XPath。看起来好多了:

    private static final String EXPRESSION_TEMPLATE = "//*[@%s='%s']";
    private static final String ID_ATTR = "id";
    // some code here
    @Override
    public NodeList lookupSiblingsAfterId(Element aRootElement, String id) {
        try {
            if (null == id) {
                throw new IllegalArgumentException("Invalid id parameter");
            }
            return (NodeList)xpath.newXPath().evaluate(String.format(EXPRESSION_TEMPLATE, ID_ATTR, id) + "[last()]/following-sibling::*", aRootElement, XPathConstants.NODESET);
        } catch (XPathExpressionException e) {
            LOGGER.error("Can't evaluate XPath expression", e);
            throw new RuntimeException(e);
        }
    }

我希望这对某人有帮助。

越飞语
2023-03-14

不幸的是,DOM API不能很好地与其他API配合使用。在前面的回答中,我提供了一个有用的轻量级列表包装器。

有了这个,你可以简单地做:

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);
倪阳飇
2023-03-14

你的问题很令人困惑。但如果只需要在具有特定属性的元素之后获取节点,并且这些节点是有序的,则可以尝试按属性过滤元素:

public List<Element> filterElements(NodeList items, int attributeStart){

    List<Element> result = IntStream.range(0, items.getLength())
            .mapToObj(children::item)
            .filter(Element.class::isInstance)
            .map(Element.class::cast)
            .filter(e -> Integer.parseInt(e.getAttribute("id")) > attributeStart)
            .collect(Collectors.toList());

    return result;

}
 类似资料:
  • 我有一个SVG文档,其中包含类似于以下内容的节点: 我想做的只是选择

  • 你们这些家伙,我有这样一个HTML: 这是将上述所有选项放入列表的代码: 实际上它不起作用。我不知道我错在哪里。请帮帮我。非常感谢。

  • 我使用Neo4j(版本3.4.1)和Spring-data-neo4j(5.0.10)。RELEASE)在我的应用程序中。我也在使用OGM。 我的节点之间有以下关系: 车辆(V)具有部件(P1和P2)。零件可从经销商处购买(D1、D2和D3)。零件本身可以相互链接(例如P2与P1链接) 我正在尝试编写一个密码查询,以获取与id匹配的零件节点。我希望获取该节点及其相关节点和关系。 下面是我的查询:

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 我的mySQL数据库中有如下表: 对于谓词,它将具有如下树视图: 我想创建一个可以选择起始节点并为此获得所有父节点的表单。例如,通过选择我想要获得: 步骤2: 有什么方法可以使用以下简单文本来打印此节点: 问题答案: 您的数据可以在RDF中表

  • 我有一棵看起来像上面的树,由一个链接结构表示: 我的目标是找到从根节点到叶节点的所有路径。 我的树遍历算法如下所示: 当我运行它时,我确信树正在按图所示构建。我已经测试过了。然而,我无法找出我的树遍历分割错误的原因。 我得到的输出是: 我已经在高度较小的树上测试了它,它是有效的。但是出于某种原因,它不适用于高度大于2的树。我认为这是树出了问题,我检查并打印了每个父级、左子级和右子级,它们打印出来如

  • 这是我的XML源: https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml 如何获取DKK(丹麦克朗)的最新汇率? 我不想使用foreach并检查货币是否为DKK... 我需要这样的东西: 知道怎么解决这个问题吗?