DOMParserUtil { public static Map<Node, List<Node>> getNestedChildrenNodesMap(Document document, String mainContainerNodeName, String containerNodeName, String childNodeName) { Map<Node, List<Node>> toReturn = new HashMap<>(); asStream(document.getElementsByTagName(mainContainerNodeName)) .map(mainContainerNode -> getChildrenNodesMap(mainContainerNode, containerNodeName, childNodeName)) .forEach(toReturn::putAll); return toReturn; } private  DOMParserUtil(); static String cleanupNodes(String fullXml, String containerNodeName, String nodeToRemoveName); static void cleanupNodes(Document document, String containerNodeName, String nodeToRemoveName); static void replaceNodeText(Document document, String containerNodeName, String nodeName, String toReplace, String replacement); static String replaceNodeName(Document document, String containerNodeName, String childNodeNameToReplace, String childNodeNameReplacement); static String getAttributeValue(Node containerNode, String attributeName); static Map<Node, String> getAttributeValues(Document document, String containerNodeName, String attributeName); static Map<Node, String> getAttributeValues(Document document, String attributeName); static void setAttributeValue(Document document, String containerNodeName, String attributeName, String attributeValue); static Map<Node, Node> createNodes(Document document, String containerNodeName, String childNodeName, String nodeContent); static Map<Node, Node> createNestedNodes(Document document, String mainContainerNodeName, String containerNodeName, String childNodeName, String nodeContent); static Node createNodeAtPosition(Node containerNode, String nodeToCreateName, String nodeContent, Integer position); static Map<Node, List<Node>> getChildrenNodesMap(String fullXml, String containerNodeName, String childNodeName); static Map<Node, List<Node>> getChildrenNodesMap(Document document, String containerNodeName, String childNodeName); static Map<Node, List<Node>> getChildrenNodesMap(Node node, String containerNodeName, String childNodeName); static List<Node> getChildrenNodesList(Node node, String childNodeName); static Map<Node, List<Node>> getNestedChildrenNodesMap(Document document, String mainContainerNodeName, String containerNodeName, String childNodeName); static List<Node> getNestedChildrenNodesList(Document document, String grandParentNodeName, String parentNodeName, String childNodeName); static List<Node> getNestedChildrenNodesList(Node node, String containerName, String childNodeName); static Document getDocument(String xml); static String getString(Document toRead);  }
@Test public void getNestedChildrenNodesMap() throws Exception { Document document = DOMParserUtil.getDocument(XML); Map<Node, List<Node>> retrieved = DOMParserUtil.getNestedChildrenNodesMap(document, MAIN_NODE, CHILD_NODE, TEST_NODE); assertNotNull(retrieved); assertEquals(2, retrieved.size()); retrieved.forEach((childNode, testNodes) -> { assertEquals(CHILD_NODE, childNode.getNodeName()); assertEquals(1, testNodes.size()); assertEquals(TEST_NODE, testNodes.get(0).getNodeName()); }); retrieved = DOMParserUtil.getNestedChildrenNodesMap(document, CHILD_NODE, NESTING_NODE, NESTED_NODE); assertNotNull(retrieved); assertEquals(2, retrieved.size()); retrieved.forEach((nestingNode, nestedNodes) -> { assertEquals(NESTING_NODE, nestingNode.getNodeName()); assertEquals(1, nestedNodes.size()); assertEquals(NESTED_NODE, nestedNodes.get(0).getNodeName()); }); }