@Override public boolean deepEquals(Node node) { if (this == node) { return true; } if (!(node instanceof Element)) { return false; } final Element other = (Element) node; if (getChildrenCount() == other.getChildrenCount() && localEquals(other)) { for (int index = 0; index < getChildrenCount(); index++) { if (!getChildAt(index).deepEquals(other.getChildAt(index))) { return false; } } return true; } else { return false; } }
@Test public void testRemoveChildren() { final Element root = new Element(NAME); root.addElement(NAME1); root.addElement(NAME1); root.addElement(NAME2); root.addElement(NAME1); root.addElement(NAME1); assertEquals(5, root.getChildrenCount(Element.class)); assertEquals(4, root.getChildrenCount(Element.class, Element.named(NAME1))); root.removeChildAt(0); assertEquals(4, root.getChildrenCount(Element.class)); assertEquals(3, root.getChildrenCount(Element.class, Element.named(NAME1))); root.removeElementsNamed(NAME1); assertEquals(1, root.getChildrenCount(Element.class)); assertEquals(0, root.getChildrenCount(Element.class, Element.named(NAME1))); } }
@Test public void testFeaturesCommentsMixed1() throws IOException { test("<?xml version=\"1.0\" encoding=\"UTF-8\"?><!--comment--><root> aaa\n aaa<child/> aaa\n aaa</root>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!--comment--><root> aaa\n aaa<child/> aaa\n aaa</root>", (doc) -> { assertEquals(2, doc.getChildrenCount()); assertEquals(1, doc.getChildrenCount(Comment.class)); assertEquals(3, doc.getRootElement().getChildrenCount()); assertEquals(2, doc.getRootElement().getChildrenCount(Text.class)); }, Feature.LOAD_COMMENTS, Feature.LOAD_SPACES, Feature.ALLOW_MIXED_CONTENT); }
@Test public void testFeaturesDefault4() throws IOException { test("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><child> </child></root>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n <root> \n <child> </child> \n </root>", (doc) -> { assertEquals(1, doc.getChildrenCount()); assertEquals("root", doc.getRootElement().getName()); assertEquals(1, doc.getRootElement().getChildrenCount()); assertEquals(1, doc.getRootElement().getChildAt(Element.class, 0).getChildrenCount()); }); }
@Test public void testRemoveChildren() { final Element root = new Element(NAME); final Element child = root.addElement(NAME); root.removeChildren(); assertEquals(0, root.getChildrenCount()); assertFalse(root.removeChild(child)); root.addElement(NAME); root.addComment("Hello"); root.addElement(NAME); root.addText("World"); root.addElement(NAME); root.removeComments(); assertEquals(4, root.getChildrenCount()); root.removeTexts(); assertEquals(3, root.getChildrenCount()); root.addElement(NAME1); root.removeElementsNamed(NAME); assertEquals(1, root.getChildrenCount()); }
@Test public void testFeaturesDefault5() throws IOException { test("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><child/></root>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n <root> \n <child></child> \n </root>", (doc) -> { assertEquals(1, doc.getChildrenCount()); assertEquals("root", doc.getRootElement().getName()); assertEquals(1, doc.getRootElement().getChildrenCount()); assertEquals(0, doc.getRootElement().getChildAt(Element.class, 0).getChildrenCount()); }); }
@Test public void testFeaturesCommentsMixed2() throws IOException { test("<?xml version=\"1.0\" encoding=\"UTF-8\"?><!--comment--><root>aaa\naaa<child/>aaa\naaa</root>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--comment--><root>aaa\naaa<child/>aaa\naaa</root>", (doc) -> { Nodes.print(doc, LOGGER, Level.DEBUG); assertEquals(2, doc.getChildrenCount()); assertEquals(1, doc.getChildrenCount(Comment.class)); assertEquals(3, doc.getRootElement().getChildrenCount()); assertEquals(2, doc.getRootElement().getChildrenCount(Text.class)); }, Feature.LOAD_COMMENTS, Feature.LOAD_SPACES, Feature.ALLOW_MIXED_CONTENT); } }
@Test public void testChildren() { final Element e = new Element(NAME); assertEquals(null, e.getDocument()); assertEquals(e, e.getRootElement()); assertEquals(e, e.getRootChild()); final Element c0 = e.addElement(NAME1); final Element c1 = e.addElement(NAME1); final Text c2 = e.addText("Hello"); final Comment c3 = e.addComment("Hello"); assertEquals(c0, e.getChildAt(0)); assertEquals(c1, e.getChildAt(1)); assertEquals(c0, e.getElementNamed(NAME1)); assertEquals(null, c2.getDocument()); assertEquals(e, c3.getRootElement()); assertEquals(e, c3.getRootChild()); assertEquals(e, c2.getParent()); assertEquals(e, c2.getParent(Element.class)); assertEquals(4, e.getChildrenCount()); assertEquals(4, e.getChildrenCount(Node.class)); assertEquals(2, e.getChildrenCount(Element.class)); assertEquals(1, e.getChildrenCount(Comment.class)); assertEquals(1, e.getChildrenCount(Text.class)); assertEquals(2, e.getChildrenCount(Parent.class)); assertEquals(4, e.getChildrenCount(Child.class)); assertEquals(2, e.getChildrenCount(Leaf.class)); }
public static void setContentOfMatchingElements(Parent parent, ElementPredicate predicate, TextContentConverter converter, Evaluator<? super Parent> evaluator) { if (parent instanceof Element) { final Element element = (Element) parent; if (predicate.accepts(element.getParent(), element)) { final int count = element.getChildrenCount(); if (count == 0) { // Add a text child final String content = converter.convertTextContent(element, null); if (content != null) { element.addText(content); } } else if (count == 1 && element.hasOnlyText()) { // Modify text child if possible final Text text = element.getChild(Text.class); final String content = converter.convertTextContent(element, text.getContent()); text.setContent(content); } } } for (final Child child : parent.getChildren()) { if (child instanceof Parent && evaluator.evaluate((Parent) child) == Evaluation.CONTINUE) { setContentOfMatchingElements((Parent) child, predicate, converter, evaluator); } } }
assertEquals(child2, root.getChildAt(1)); assertEquals(child3, root.getChildAt(2)); assertEquals(1, root.getChildrenCount(Element.class, Element.named(NAME1))); assertEquals(1, root.getChildrenCount(Element.class, Element.named(NAME2))); assertEquals(1, root.getChildrenCount(Element.class, Element.named(NAME3))); assertEquals(0, root.getChildrenCount(Element.class, Element.named(NAME1))); assertEquals(1, root.getChildrenCount(Element.class, Element.named(NAME2))); assertEquals(1, root.getChildrenCount(Element.class, Element.named(NAME3))); assertEquals(0, root.getChildrenCount(Element.class, Element.named(NAME1))); assertEquals(0, root.getChildrenCount(Element.class, Element.named(NAME2))); assertEquals(1, root.getChildrenCount(Element.class, Element.named(NAME3))); root.removeChildAt(0); assertEquals(child2, root.getChildAt(1)); assertEquals(child3, root.getChildAt(2)); assertEquals(1, root.getChildrenCount(Element.class, Element.named(NAME1))); assertEquals(1, root.getChildrenCount(Element.class, Element.named(NAME2))); assertEquals(1, root.getChildrenCount(Element.class, Element.named(NAME3)));
final Element child4 = root.addElement(NAME4); final Element child5 = root.addElement(NAME1); assertEquals(3, root.getChildrenCount(Element.class, Element.named(NAME1))); assertEquals(0, root.getChildrenCount(Element.class, Element.named(NAME2))); assertEquals(5, root.getChildrenCount(Element.class)); assertEquals(child1, root.getChildAt(0)); assertEquals(child2, root.getChildAt(1)); assertEquals(2, root.getChildrenCount(Element.class, Element.named(NAME1))); assertEquals(0, root.getChildrenCount(Element.class, Element.named(NAME2))); assertEquals(4, root.getChildrenCount(Element.class)); assertEquals(child2, root.getChildAt(0)); assertEquals(child3, root.getChildAt(1)); assertEquals(1, root.getChildrenCount(Element.class, Element.named(NAME1))); assertEquals(0, root.getChildrenCount(Element.class, Element.named(NAME2))); assertEquals(3, root.getChildrenCount(Element.class)); assertEquals(child2, root.getChildAt(0)); assertEquals(child3, root.getChildAt(1));
@Test public void testFeaturesDefault0() throws IOException { test("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root/>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!-- comment --><root/><!-- comment -->", (doc) -> { assertEquals(1, doc.getChildrenCount()); assertEquals("root", doc.getRootElement().getName()); assertEquals(0, doc.getRootElement().getChildrenCount()); }); }
@Test public void testFeaturesDefault1() throws IOException { test("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root/>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!-- comment --><root></root><!-- comment -->", (doc) -> { assertEquals(1, doc.getChildrenCount()); assertEquals("root", doc.getRootElement().getName()); assertEquals(0, doc.getRootElement().getChildrenCount()); }); }
@Test public void testFeaturesDefault2() throws IOException { test("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root> </root>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!-- comment --><root> <!-- comment --> </root><!-- comment -->", (doc) -> { assertEquals(1, doc.getChildrenCount()); assertEquals("root", doc.getRootElement().getName()); assertEquals(1, doc.getRootElement().getChildrenCount()); }); }
@Test public void testFeaturesDefault7() throws IOException { test("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><child/></root>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n <root> \n <child/> \n </root>", (doc) -> { assertEquals(1, doc.getChildrenCount()); assertEquals("root", doc.getRootElement().getName()); assertEquals(1, doc.getRootElement().getChildrenCount()); }); }
@Test public void testFeaturesDefault3() throws IOException { test("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root>aaa</root>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!-- comment --><root><!-- comment -->aaa</root><!-- comment -->", (doc) -> { assertEquals(1, doc.getChildrenCount()); assertEquals("root", doc.getRootElement().getName()); assertEquals(1, doc.getRootElement().getChildrenCount()); }); }
@Test public void testFeaturesDefault6() throws IOException { test("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><child/></root>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><child/></root>", (doc) -> { assertEquals(1, doc.getChildrenCount()); assertEquals("root", doc.getRootElement().getName()); assertEquals(1, doc.getRootElement().getChildrenCount()); }); }
@Test public void testChangeTexts() { final Element root = new Element(NAME); root.addText("hello", false); root.addText("HELLO", false); root.changeTexts(String::toUpperCase); assertEquals(2, root.getChildrenCount()); assertEquals("HELLO", root.getChildAt(Text.class, 0).getContent()); assertEquals("HELLO", root.getChildAt(Text.class, 1).getContent()); root.removeChildren(); final Element child1 = root.addElement(NAME1); final Element child2 = root.addElement(NAME2); final Element child3 = root.addElement(NAME1); child1.addText("hello"); child2.addText("hello"); child3.addText("hel"); child3.addText("lo", false); assertEquals(2, child3.getChildrenCount()); root.changeTexts(String::toUpperCase); assertEquals(2, child3.getChildrenCount()); root.changeNamedTexts(NAME1, String::toUpperCase); assertEquals(1, child3.getChildrenCount()); assertEquals("HELLO", child1.getText()); assertEquals("HELLO", child3.getText()); }
@Test public void testChangeComments() { final Element root = new Element(NAME); root.addComment("hello", false); root.addComment("HELLO", false); root.changeComments(String::toUpperCase); assertEquals(2, root.getChildrenCount()); assertEquals("HELLO", root.getChildAt(Comment.class, 0).getContent()); assertEquals("HELLO", root.getChildAt(Comment.class, 1).getContent()); root.removeChildren(); final Element child1 = root.addElement(NAME1); final Element child2 = root.addElement(NAME2); final Element child3 = root.addElement(NAME1); child1.addComment("hello"); child2.addComment("hello"); child3.addComment("hel"); child3.addComment("lo", false); assertEquals(2, child3.getChildrenCount()); root.changeComments(String::toUpperCase, true); assertEquals(2, child3.getChildrenCount()); assertEquals("HELLO", child1.getChild(Comment.class).getContent()); assertEquals("HEL", child3.getChildAt(Comment.class, 0).getContent()); }
@Test public void testGetChildren() { final Element root = new Element(NAME); assertEquals(null, root.getLastChild()); final Element child1 = root.addElement(NAME1); final Element child2 = root.addElement(NAME2); final Element child3 = root.addElement(NAME1); child3.addAttribute(NAME, VALUE); final Comment child4 = root.addComment("Hello"); assertEquals(4, root.getChildrenCount()); assertTrue(root.hasChildren(Element.class)); assertTrue(root.hasChildren(Comment.class)); assertFalse(root.hasChildren(Text.class)); assertEquals(child4, root.getLastChild()); assertEquals(child1, root.getChild(Element.class)); assertEquals(child1, root.getElementNamed(NAME1)); assertEquals(3, root.getChildrenCount(Element.class)); assertEquals(2, root.getChildrenCount(Element.class, Element.named(NAME1))); assertEquals(child2, root.getChild(Element.class, Element.named(NAME2))); assertEquals(child2, root.getChildAt(Element.class, Element.named(NAME2), 0)); assertEquals(null, root.getChildAt(Element.class, Element.named(NAME2), 1)); assertEquals(child3, root.getChildAt(2)); assertEquals(child3, root.getChildAt(Element.class, 2)); assertEquals(child4, root.getChildAt(Comment.class, 0)); assertEquals(3, Iterables.size(root.getElements())); assertEquals(1, Iterables.size(root.getComments())); assertEquals(0, Iterables.size(root.getTexts())); assertEquals(child3, root.getElementNamedWithAttribute(NAME1, NAME, VALUE)); }