/** * Iterates through the sub-tree and invokes the appropriate handler for each child node. * * @param nodeHandler the handler invoked for each element node * @param textNodeHandler the handler invoked for each text node */ public void visit(@Nullable Consumer<StructuredNode> nodeHandler, @Nullable Consumer<Node> textNodeHandler) { if (node.getNodeType() == Node.TEXT_NODE) { if (textNodeHandler != null) { textNodeHandler.accept(node); } } else if (node.getNodeType() == Node.ELEMENT_NODE) { if (nodeHandler != null) { nodeHandler.accept(this); } getChildren().forEach(c -> c.visit(nodeHandler, textNodeHandler)); } }