use the children axis instead of getChildNodes([ContentRange])

Signed-off-by: Florian Thienel <florian@thienel.org>
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/DeepCopyTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/DeepCopyTest.java
index 071aa7d..9c3535c 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/DeepCopyTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/DeepCopyTest.java
@@ -11,10 +11,12 @@
 package org.eclipse.vex.core.internal.dom;

 

 import static org.junit.Assert.assertEquals;

+import static org.junit.Assert.assertFalse;

 import static org.junit.Assert.assertNotNull;

 import static org.junit.Assert.assertNotSame;

 import static org.junit.Assert.assertTrue;

 

+import java.util.Iterator;

 import java.util.List;

 

 import org.junit.Test;

@@ -102,11 +104,11 @@
 

 		final DeepCopy deepCopy = new DeepCopy(parent);

 		final Element copiedParent = (Element) deepCopy.getNodes().get(0);

-		final List<Node> copiedChildNodes = copiedParent.getChildNodes();

+		final Iterator<Node> copiedChildren = copiedParent.children().iterator();

 

-		assertEquals(2, copiedChildNodes.size());

-		assertEquals("1", ((Element) copiedChildNodes.get(0)).getAttribute("order").getValue());

-		assertEquals("2", ((Element) copiedChildNodes.get(1)).getAttribute("order").getValue());

+		assertEquals("1", ((Element) copiedChildren.next()).getAttribute("order").getValue());

+		assertEquals("2", ((Element) copiedChildren.next()).getAttribute("order").getValue());

+		assertFalse(copiedChildren.hasNext());

 	}

 

 	@Test

@@ -132,18 +134,12 @@
 

 		final DeepCopy deepCopy = new DeepCopy(parent);

 		final Element copiedParent = (Element) deepCopy.getNodes().get(0);

-		final List<Node> copiedChildNodes = copiedParent.getChildNodes();

+		final Iterator<Node> copiedChildren = copiedParent.children().iterator();

 

-		assertEquals(3, copiedChildNodes.size());

-		assertTrue(copiedChildNodes.get(0).isAssociated());

-		assertTrue(copiedChildNodes.get(0) instanceof Element);

-		assertEquals("Hello", copiedChildNodes.get(0).getText());

-		assertTrue(copiedChildNodes.get(1).isAssociated());

-		assertTrue(copiedChildNodes.get(1) instanceof Text);

-		assertEquals(" New ", copiedChildNodes.get(1).getText());

-		assertTrue(copiedChildNodes.get(2).isAssociated());

-		assertTrue(copiedChildNodes.get(2) instanceof Element);

-		assertEquals("World", copiedChildNodes.get(2).getText());

+		assertNodeIsAssociatedElementWithText("Hello", copiedChildren.next());

+		assertNodeIsAssociatedText(" New ", copiedChildren.next());

+		assertNodeIsAssociatedElementWithText("World", copiedChildren.next());

+		assertFalse(copiedChildren.hasNext());

 	}

 

 	@Test

@@ -226,11 +222,22 @@
 

 		final DeepCopy deepCopy = new DeepCopy(parent);

 		final Element copiedParent = (Element) deepCopy.getNodes().get(0);

-		final List<Node> copiedChildNodes = copiedParent.getChildNodes();

+		final Iterator<Node> copiedChildren = copiedParent.children().iterator();

 

-		assertEquals(2, copiedChildNodes.size());

-		assertEquals("Hello", copiedChildNodes.get(0).getText());

-		assertEquals("World", copiedChildNodes.get(1).getText());

+		assertEquals("Hello", copiedChildren.next().getText());

+		assertEquals("World", copiedChildren.next().getText());

+		assertFalse(copiedChildren.hasNext());

 	}

 

+	private static void assertNodeIsAssociatedElementWithText(final String expectedText, final Node actualNode) {

+		assertTrue(actualNode.isAssociated());

+		assertTrue(actualNode instanceof Element);

+		assertEquals(expectedText, actualNode.getText());

+	}

+

+	private static void assertNodeIsAssociatedText(final String expectedText, final Node actualNode) {

+		assertTrue(actualNode.isAssociated());

+		assertTrue(actualNode instanceof Text);

+		assertEquals(expectedText, actualNode.getText());

+	}

 }

diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/DocumentFragmentTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/DocumentFragmentTest.java
index 9d81560..2bc078b 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/DocumentFragmentTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/DocumentFragmentTest.java
@@ -11,13 +11,14 @@
 package org.eclipse.vex.core.internal.dom;

 

 import static org.junit.Assert.assertEquals;

+import static org.junit.Assert.assertFalse;

 import static org.junit.Assert.assertNull;

 import static org.junit.Assert.assertSame;

 import static org.junit.Assert.assertTrue;

 

 import java.util.Arrays;

 import java.util.Collections;

-import java.util.List;

+import java.util.Iterator;

 

 import org.eclipse.core.runtime.AssertionFailedException;

 import org.junit.Test;

@@ -47,10 +48,9 @@
 		final GapContent content = new GapContent(3);

 		content.insertText(0, "abc");

 		final DocumentFragment fragment = new DocumentFragment(content, Collections.<Node> emptyList());

-		final List<Node> childNodes = fragment.getChildNodes();

-		assertEquals(1, childNodes.size());

-		final Node child = childNodes.get(0);

-		assertTrue(child instanceof Text);

+		final Iterator<Node> actualChildren = fragment.children().iterator();

+		assertTrue(actualChildren.next() instanceof Text);

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

@@ -66,8 +66,10 @@
 		child2.associate(content, new ContentRange(2, 3));

 

 		final DocumentFragment fragment = new DocumentFragment(content, Arrays.<Node> asList(child1, child2));

-		assertSame(child1, fragment.getChildNodes().get(0));

-		assertSame(child2, fragment.getChildNodes().get(1));

+		final Iterator<Node> actualChildren = fragment.children().iterator();

+		assertSame(child1, actualChildren.next());

+		assertSame(child2, actualChildren.next());

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/DocumentTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/DocumentTest.java
index 09b4e6d..9a07a4c 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/DocumentTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/DocumentTest.java
@@ -11,11 +11,12 @@
 package org.eclipse.vex.core.internal.dom;

 

 import static org.junit.Assert.assertEquals;

+import static org.junit.Assert.assertFalse;

 import static org.junit.Assert.assertNotNull;

 import static org.junit.Assert.assertSame;

 import static org.junit.Assert.assertTrue;

 

-import java.util.List;

+import java.util.Iterator;

 

 import org.eclipse.core.runtime.AssertionFailedException;

 import org.eclipse.core.runtime.QualifiedName;

@@ -113,11 +114,14 @@
 		assertNodeEquals(expectedFragment, actualFragment, 0);

 	}

 

-	private static void assertNodesEqual(final List<? extends Node> expected, final List<? extends Node> actual, final int rangeOffsetExpected) {

-		assertEquals(expected.size(), actual.size());

-		for (int i = 0; i < expected.size(); i++) {

-			assertNodeEquals(expected.get(i), actual.get(i), rangeOffsetExpected);

+	private static void assertNodesEqual(final Iterable<Node> expected, final Iterable<Node> actual, final int rangeOffsetExpected) {

+		final Iterator<Node> expectedIterator = expected.iterator();

+		final Iterator<Node> actualIterator = actual.iterator();

+		while (expectedIterator.hasNext() && actualIterator.hasNext()) {

+			assertNodeEquals(expectedIterator.next(), actualIterator.next(), rangeOffsetExpected);

 		}

+		assertFalse("more elements expected", expectedIterator.hasNext());

+		assertFalse("less elements expected", actualIterator.hasNext());

 	}

 

 	private static void assertNodeEquals(final Node expected, final Node actual, final int rangeOffsetExpected) {

@@ -125,7 +129,7 @@
 		assertEquals("node range", expected.getRange(), actual.getRange().moveBy(rangeOffsetExpected));

 		assertEquals("node text", expected.getText(), actual.getText());

 		if (expected instanceof Parent) {

-			assertNodesEqual(((Parent) expected).getChildNodes(), ((Parent) actual).getChildNodes(), rangeOffsetExpected);

+			assertNodesEqual(((Parent) expected).children(), ((Parent) actual).children(), rangeOffsetExpected);

 		}

 	}

 

diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/L1CommentHandlingTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/L1CommentHandlingTest.java
index 111f422..9b603db 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/L1CommentHandlingTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/L1CommentHandlingTest.java
@@ -15,6 +15,7 @@
 import static org.junit.Assert.assertSame;

 import static org.junit.Assert.assertTrue;

 

+import java.util.Iterator;

 import java.util.List;

 

 import org.eclipse.core.runtime.QualifiedName;

@@ -54,9 +55,9 @@
 

 		assertSame(rootElement, comment.getParent());

 		assertTrue(comment.isAssociated());

-		final List<Node> newChildNodes = rootElement.getChildNodes();

-		assertEquals(2, newChildNodes.size());

-		assertSame(newChildNodes.get(0), comment);

+		final Iterator<Node> actualChildren = rootElement.children().iterator();

+		assertSame(comment, actualChildren.next());

+		assertSame(titleElement, actualChildren.next());

 	}

 

 	@Test

diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/ParentTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/ParentTest.java
index da04c1e..e73458e 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/ParentTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/ParentTest.java
@@ -40,7 +40,7 @@
 		assertTrue(parent.hasChildren());

 		assertEquals(1, parent.getChildCount());

 		assertSame(child, parent.getChildNode(0));

-		assertSame(child, parent.getChildNodes().get(0));

+		assertSame(child, parent.children().iterator().next());

 	}

 

 	@Test

@@ -56,22 +56,26 @@
 		parent.insertChild(1, child);

 		assertEquals(3, parent.getChildCount());

 		assertSame(child, parent.getChildNode(1));

-		assertSame(child, parent.getChildNodes().get(1));

+		final Iterator<Node> actualChildren = parent.children().iterator();

+		actualChildren.next(); // TODO implement Axis.get(int);

+		assertSame(child, actualChildren.next());

 	}

 

 	@Test

 	public void removeChild() throws Exception {

-		final TestChild child = new TestChild();

+		final TestChild secondChild = new TestChild();

 		parent.addChild(new TestChild());

-		parent.addChild(child);

+		parent.addChild(secondChild);

 		parent.addChild(new TestChild());

 		assertTrue(parent.hasChildren());

 		assertEquals(3, parent.getChildCount());

 

-		parent.removeChild(child);

+		parent.removeChild(secondChild);

 		assertTrue(parent.hasChildren());

 		assertEquals(2, parent.getChildCount());

-		assertFalse(parent.getChildNodes().contains(child));

+		for (final Node child : parent.children()) {

+			assertTrue(child != secondChild);

+		}

 	}

 

 	@Test

@@ -106,15 +110,6 @@
 	}

 

 	@Test(expected = UnsupportedOperationException.class)

-	public void shouldReturnUnmodifiableChildNodesList() throws Exception {

-		addTestChild();

-		addTestChild();

-		addTestChild();

-		final List<Node> childNodes = parent.getChildNodes();

-		childNodes.add(new TestChild());

-	}

-

-	@Test(expected = UnsupportedOperationException.class)

 	public void shouldReturnUnmodifiableChildNodesIterator() throws Exception {

 		addTestChild();

 		addTestChild();

@@ -131,10 +126,11 @@
 		content.insertText(child.getStartOffset(), "Hello ");

 		content.insertText(parent.getEndOffset(), "World");

 

-		assertEquals(3, parent.getChildNodes().size());

-		assertTrue(parent.getChildNodes().get(0) instanceof Text);

-		assertSame(child, parent.getChildNodes().get(1));

-		assertTrue(parent.getChildNodes().get(2) instanceof Text);

+		final Iterator<Node> children = parent.children().iterator();

+		assertTrue(children.next() instanceof Text);

+		assertSame(child, children.next());

+		assertTrue(children.next() instanceof Text);

+		assertFalse(children.hasNext());

 	}

 

 	@Test

@@ -146,8 +142,9 @@
 		assertEquals(1, child.getStartOffset());

 		assertEquals(2, child.getEndOffset());

 

-		assertEquals(1, parent.getChildNodes().size());

-		assertSame(child, parent.getChildNodes().get(0));

+		final Iterator<Node> children = parent.children().iterator();

+		assertSame(child, children.next());

+		assertFalse(children.hasNext());

 	}

 

 	@Test

@@ -157,10 +154,10 @@
 		final TestChild child3 = addTestChild();

 		addTestChild();

 

-		final List<Node> childNodes = parent.getChildNodes(new ContentRange(child2.getStartOffset(), child3.getEndOffset()));

-		assertEquals(2, childNodes.size());

-		assertSame(child2, childNodes.get(0));

-		assertSame(child3, childNodes.get(1));

+		final Iterator<Node> children = parent.children(new ContentRange(child2.getStartOffset(), child3.getEndOffset())).iterator();

+		assertSame(child2, children.next());

+		assertSame(child3, children.next());

+		assertFalse(children.hasNext());

 	}

 

 	@Test

@@ -171,108 +168,102 @@
 		content.insertText(child1.getStartOffset(), "Hello");

 		content.insertText(child2.getStartOffset(), "World!");

 

-		final List<Node> childNodes = parent.getChildNodes(child1.getRange().resizeBy(-2, 2));

-		assertEquals(3, childNodes.size());

-		assertTrue(childNodes.get(0) instanceof Text);

-		assertSame(child1, childNodes.get(1));

-		assertTrue(childNodes.get(2) instanceof Text);

-		assertEquals("lo", childNodes.get(0).getText());

-		assertEquals("", childNodes.get(1).getText());

-		assertEquals("Wo", childNodes.get(2).getText());

+		final Iterator<Node> children = parent.children(child1.getRange().resizeBy(-2, 2)).iterator();

+		assertTextNodeEquals("lo", 4, 5, children.next());

+		assertChildNodeEquals("", 6, 7, children.next());

+		assertTextNodeEquals("Wo", 8, 9, children.next());

+		assertFalse(children.hasNext());

 	}

 

 	@Test

 	public void shouldSetParentOnTextNodes() throws Exception {

 		content.insertText(parent.getEndOffset(), "Hello World");

-		assertSame(parent, parent.getChildNodes().get(0).getParent());

+		assertSame(parent, parent.children().iterator().next().getParent());

 	}

 

 	@Test

 	public void shouldProvideNoChildNodesIfEmpty() throws Exception {

-		assertTrue(parent.getChildNodes().isEmpty());

+		assertFalse(parent.children().iterator().hasNext());

 	}

 

 	@Test

 	public void shouldProvideAddedChildren() throws Exception {

-		final ArrayList<TestChild> children = new ArrayList<TestChild>();

+		final ArrayList<TestChild> expectedChildren = new ArrayList<TestChild>();

 		for (int i = 0; i < 4; i++) {

-			children.add(addTestChild());

+			expectedChildren.add(addTestChild());

 		}

 

-		final List<Node> childNodes = parent.getChildNodes();

-

-		assertEquals(4, childNodes.size());

-		for (int i = 0; i < 4; i++) {

-			assertSame(children.get(i), childNodes.get(i));

+		int i = 0;

+		for (final Node actualChild : parent.children()) {

+			assertTrue(i < expectedChildren.size());

+			assertSame(expectedChildren.get(i++), actualChild);

 		}

 	}

 

 	@Test

 	public void shouldProvideAddedChildrenInRange1To3() throws Exception {

-		final ArrayList<TestChild> children = new ArrayList<TestChild>();

+		final ArrayList<TestChild> expectedChildren = new ArrayList<TestChild>();

 		for (int i = 0; i < 4; i++) {

-			children.add(addTestChild());

+			expectedChildren.add(addTestChild());

 		}

 

-		final List<Node> childNodes = parent.getChildNodes(new ContentRange(children.get(1).getStartOffset(), children.get(3).getEndOffset()));

-		assertEquals(3, childNodes.size());

-		assertSame(children.get(1), childNodes.get(0));

-		assertSame(children.get(2), childNodes.get(1));

-		assertSame(children.get(3), childNodes.get(2));

+		final Iterator<Node> actualChildren = parent.children(new ContentRange(expectedChildren.get(1).getStartOffset(), expectedChildren.get(3).getEndOffset())).iterator();

+		assertSame(expectedChildren.get(1), actualChildren.next());

+		assertSame(expectedChildren.get(2), actualChildren.next());

+		assertSame(expectedChildren.get(3), actualChildren.next());

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

 	public void shouldProvideAddedChildrenInRange1To2() throws Exception {

-		final ArrayList<TestChild> children = new ArrayList<TestChild>();

+		final ArrayList<TestChild> expectedChildren = new ArrayList<TestChild>();

 		for (int i = 0; i < 4; i++) {

-			children.add(addTestChild());

+			expectedChildren.add(addTestChild());

 		}

 

-		final List<Node> childNodes = parent.getChildNodes(new ContentRange(children.get(1).getStartOffset(), children.get(3).getStartOffset()));

-		assertEquals(2, childNodes.size());

-		assertSame(children.get(1), childNodes.get(0));

-		assertSame(children.get(2), childNodes.get(1));

+		final Iterator<Node> actualChildren = parent.children(new ContentRange(expectedChildren.get(1).getStartOffset(), expectedChildren.get(3).getStartOffset())).iterator();

+		assertSame(expectedChildren.get(1), actualChildren.next());

+		assertSame(expectedChildren.get(2), actualChildren.next());

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

 	public void shouldProvideAddedChildrenInRange2() throws Exception {

-		final ArrayList<TestChild> children = new ArrayList<TestChild>();

+		final ArrayList<TestChild> expectedChildren = new ArrayList<TestChild>();

 		for (int i = 0; i < 4; i++) {

-			children.add(addTestChild());

+			expectedChildren.add(addTestChild());

 		}

 

-		final List<Node> childNodes = parent.getChildNodes(new ContentRange(children.get(1).getEndOffset(), children.get(3).getStartOffset()));

-		assertEquals(1, childNodes.size());

-		assertSame(children.get(2), childNodes.get(0));

+		final Iterator<Node> actualChildren = parent.children(new ContentRange(expectedChildren.get(1).getEndOffset(), expectedChildren.get(3).getStartOffset())).iterator();

+		assertSame(expectedChildren.get(2), actualChildren.next());

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

 	public void shouldProvideAddedChildrenInRange2To3() throws Exception {

-		final ArrayList<TestChild> children = new ArrayList<TestChild>();

+		final ArrayList<TestChild> expectedChildren = new ArrayList<TestChild>();

 		for (int i = 0; i < 4; i++) {

-			children.add(addTestChild());

+			expectedChildren.add(addTestChild());

 		}

 

-		final List<Node> childNodes = parent.getChildNodes(new ContentRange(children.get(1).getEndOffset(), children.get(3).getEndOffset()));

-		assertEquals(2, childNodes.size());

-		assertSame(children.get(2), childNodes.get(0));

-		assertSame(children.get(3), childNodes.get(1));

+		final Iterator<Node> actualChildren = parent.children(new ContentRange(expectedChildren.get(1).getEndOffset(), expectedChildren.get(3).getEndOffset())).iterator();

+		assertSame(expectedChildren.get(2), actualChildren.next());

+		assertSame(expectedChildren.get(3), actualChildren.next());

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

 	public void shouldProvideAllDissociatedChildren() throws Exception {

-		final ArrayList<TestChild> children = new ArrayList<TestChild>();

+		final ArrayList<TestChild> expectedChildren = new ArrayList<TestChild>();

 		for (int i = 0; i < 4; i++) {

 			final TestChild child = new TestChild();

-			children.add(child);

+			expectedChildren.add(child);

 			parent.addChild(child);

 		}

 

-		final List<Node> childNodes = parent.getChildNodes();

-

-		assertEquals(4, childNodes.size());

-		for (int i = 0; i < 4; i++) {

-			assertSame(children.get(i), childNodes.get(i));

+		int i = 0;

+		for (final Node actualChild : parent.children()) {

+			assertSame(expectedChildren.get(i++), actualChild);

 		}

 	}

 

@@ -280,20 +271,18 @@
 	public void shouldProvideSingleText() throws Exception {

 		content.insertText(parent.getEndOffset(), "Hello World");

 

-		final List<Node> childNodes = parent.getChildNodes();

-

-		assertEquals(1, childNodes.size());

-		assertTextNodeEquals("Hello World", 1, 11, childNodes.get(0));

+		final Iterator<Node> actualChildren = parent.children().iterator();

+		assertTextNodeEquals("Hello World", 1, 11, actualChildren.next());

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

 	public void shouldProvideSingleCharacterText() throws Exception {

 		content.insertText(parent.getEndOffset(), "x");

 

-		final List<Node> childNodes = parent.getChildNodes();

-

-		assertEquals(1, childNodes.size());

-		assertTextNodeEquals("x", 1, 1, childNodes.get(0));

+		final Iterator<Node> actualChildren = parent.children().iterator();

+		assertTextNodeEquals("x", 1, 1, actualChildren.next());

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

@@ -301,11 +290,10 @@
 		content.insertText(parent.getEndOffset(), "Hello World");

 		addTestChild();

 

-		final List<Node> childNodes = parent.getChildNodes();

-

-		assertEquals(2, childNodes.size());

-		assertTextNodeEquals("Hello World", 1, 11, childNodes.get(0));

-		assertChildNodeEquals("", 12, 13, childNodes.get(1));

+		final Iterator<Node> actualChildren = parent.children().iterator();

+		assertTextNodeEquals("Hello World", 1, 11, actualChildren.next());

+		assertChildNodeEquals("", 12, 13, actualChildren.next());

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

@@ -313,11 +301,10 @@
 		content.insertText(parent.getEndOffset(), "x");

 		addTestChild();

 

-		final List<Node> childNodes = parent.getChildNodes();

-

-		assertEquals(2, childNodes.size());

-		assertTextNodeEquals("x", 1, 1, childNodes.get(0));

-		assertChildNodeEquals("", 2, 3, childNodes.get(1));

+		final Iterator<Node> actualChildren = parent.children().iterator();

+		assertTextNodeEquals("x", 1, 1, actualChildren.next());

+		assertChildNodeEquals("", 2, 3, actualChildren.next());

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

@@ -325,11 +312,10 @@
 		addTestChild();

 		content.insertText(parent.getEndOffset(), "Hello World");

 

-		final List<Node> childNodes = parent.getChildNodes();

-

-		assertEquals(2, childNodes.size());

-		assertChildNodeEquals("", 1, 2, childNodes.get(0));

-		assertTextNodeEquals("Hello World", 3, 13, childNodes.get(1));

+		final Iterator<Node> actualChildren = parent.children().iterator();

+		assertChildNodeEquals("", 1, 2, actualChildren.next());

+		assertTextNodeEquals("Hello World", 3, 13, actualChildren.next());

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

@@ -337,43 +323,43 @@
 		addTestChild();

 		content.insertText(parent.getEndOffset(), "x");

 

-		final List<Node> childNodes = parent.getChildNodes();

-

-		assertEquals(2, childNodes.size());

-		assertChildNodeEquals("", 1, 2, childNodes.get(0));

-		assertTextNodeEquals("x", 3, 3, childNodes.get(1));

+		final Iterator<Node> actualChildren = parent.children().iterator();

+		assertChildNodeEquals("", 1, 2, actualChildren.next());

+		assertTextNodeEquals("x", 3, 3, actualChildren.next());

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

 	public void shouldProvideAllChildNodesIncludingText() throws Exception {

 		setUpChildNodes();

-		final List<Node> childNodes = parent.getChildNodes();

-		assertTextNodeEquals("Hello ", 1, 6, childNodes.get(0));

-		assertChildNodeEquals("Child1", 7, 14, childNodes.get(1));

-		assertChildNodeEquals("Child2", 15, 22, childNodes.get(2));

-		assertTextNodeEquals(" World", 23, 28, childNodes.get(3));

+		final Iterator<Node> actualChildren = parent.children().iterator();

+		assertTextNodeEquals("Hello ", 1, 6, actualChildren.next());

+		assertChildNodeEquals("Child1", 7, 14, actualChildren.next());

+		assertChildNodeEquals("Child2", 15, 22, actualChildren.next());

+		assertTextNodeEquals(" World", 23, 28, actualChildren.next());

+		assertFalse(actualChildren.hasNext());

 	}

 

 	@Test

 	public void shouldHandleSmallerStartOffset() throws Exception {

 		setUpChildNodes();

 		content.insertText(parent.getStartOffset(), "prefix");

-		final List<Node> childNodes = parent.getChildNodes(parent.getRange().resizeBy(-2, 0));

-		assertTextNodeEquals("Hello ", 7, 12, childNodes.get(0));

-		assertChildNodeEquals("Child1", 13, 20, childNodes.get(1));

-		assertChildNodeEquals("Child2", 21, 28, childNodes.get(2));

-		assertTextNodeEquals(" World", 29, 34, childNodes.get(3));

+		final Iterator<Node> actualChildren = parent.children(parent.getRange().resizeBy(-2, 0)).iterator();

+		assertTextNodeEquals("Hello ", 7, 12, actualChildren.next());

+		assertChildNodeEquals("Child1", 13, 20, actualChildren.next());

+		assertChildNodeEquals("Child2", 21, 28, actualChildren.next());

+		assertTextNodeEquals(" World", 29, 34, actualChildren.next());

 	}

 

 	@Test

 	public void shouldHandleBiggerEndOffset() throws Exception {

 		setUpChildNodes();

 		content.insertText(parent.getEndOffset() + 1, "suffix");

-		final List<Node> childNodes = parent.getChildNodes();

-		assertTextNodeEquals("Hello ", 1, 6, childNodes.get(0));

-		assertChildNodeEquals("Child1", 7, 14, childNodes.get(1));

-		assertChildNodeEquals("Child2", 15, 22, childNodes.get(2));

-		assertTextNodeEquals(" World", 23, 28, childNodes.get(3));

+		final Iterator<Node> actualChildren = parent.children().iterator();

+		assertTextNodeEquals("Hello ", 1, 6, actualChildren.next());

+		assertChildNodeEquals("Child1", 7, 14, actualChildren.next());

+		assertChildNodeEquals("Child2", 15, 22, actualChildren.next());

+		assertTextNodeEquals(" World", 23, 28, actualChildren.next());

 	}

 

 	@Test

@@ -385,7 +371,7 @@
 	@Test

 	public void shouldReturnTextWithinBoundaries() throws Exception {

 		content.insertText(parent.getEndOffset(), "Hello World");

-		final Node text = parent.getChildNodes().get(0);

+		final Node text = parent.children().iterator().next();

 		assertTextNodeEquals("Hello World", text.getStartOffset(), text.getEndOffset(), parent.getChildNodeAt(text.getStartOffset()));

 		assertTextNodeEquals("Hello World", text.getStartOffset(), text.getEndOffset(), parent.getChildNodeAt(text.getStartOffset() + 1));

 		assertTextNodeEquals("Hello World", text.getStartOffset(), text.getEndOffset(), parent.getChildNodeAt(text.getEndOffset() - 1));

@@ -401,7 +387,7 @@
 		parent.addChild(child);

 		child.associate(content, new ContentRange(offset, offset + 1));

 		content.insertText(child.getEndOffset(), "Hello World");

-		final Node text = child.getChildNodes().get(0);

+		final Node text = child.children().iterator().next();

 		assertTextNodeEquals("Hello World", text.getStartOffset(), text.getEndOffset(), parent.getChildNodeAt(text.getStartOffset()));

 		assertTextNodeEquals("Hello World", text.getStartOffset(), text.getEndOffset(), parent.getChildNodeAt(text.getStartOffset() + 1));

 		assertTextNodeEquals("Hello World", text.getStartOffset(), text.getEndOffset(), parent.getChildNodeAt(text.getEndOffset() - 1));

diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/io/DocumentReaderTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/io/DocumentReaderTest.java
index d9d1d80..5e1f0e0 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/io/DocumentReaderTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/io/DocumentReaderTest.java
@@ -14,18 +14,18 @@
 import static org.junit.Assert.assertFalse;

 import static org.junit.Assert.assertNotNull;

 import static org.junit.Assert.assertNull;

+import static org.junit.Assert.assertSame;

 import static org.junit.Assert.assertTrue;

 

 import java.io.IOException;

 import java.net.URL;

-import java.util.List;

+import java.util.Iterator;

 

 import org.eclipse.vex.core.internal.dom.Comment;

 import org.eclipse.vex.core.internal.dom.Document;

 import org.eclipse.vex.core.internal.dom.DocumentContentModel;

 import org.eclipse.vex.core.internal.dom.Element;

 import org.eclipse.vex.core.internal.dom.Node;

-import org.eclipse.vex.core.internal.io.DocumentReader;

 import org.eclipse.vex.core.tests.TestResources;

 import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;

 import org.eclipse.wst.xml.core.internal.contentmodel.ContentModelManager;

@@ -139,26 +139,30 @@
 		final DocumentReader reader = new DocumentReader();

 

 		final Document document = reader.read(TestResources.get("documentWithComments.xml"));

-		final List<Node> documentChildNodes = document.getChildNodes();

-		assertEquals(3, documentChildNodes.size());

+		final Iterator<Node> documentChildren = document.children().iterator();

 

-		final Comment documentComment1 = (Comment) documentChildNodes.get(0);

+		final Comment documentComment1 = (Comment) documentChildren.next();

 		assertEquals("A comment before the root element.", documentComment1.getText());

-

-		final Comment documentComment2 = (Comment) documentChildNodes.get(2);

+		assertSame(document.getRootElement(), documentChildren.next());

+		final Comment documentComment2 = (Comment) documentChildren.next();

 		assertEquals("A final comment after the root element.", documentComment2.getText());

+		assertFalse(documentChildren.hasNext());

 

 		final Element rootElement = document.getRootElement();

-		final List<Node> rootChildNodes = rootElement.getChildNodes();

-		assertEquals(4, rootChildNodes.size());

+		final Iterator<Node> rootChildren = rootElement.children().iterator();

 

-		final Comment comment1 = (Comment) rootChildNodes.get(0);

+		final Comment comment1 = (Comment) rootChildren.next();

 		assertEquals("A comment within the root element.", comment1.getText());

 

-		final Comment comment2 = (Comment) ((Element) rootChildNodes.get(1)).getChildNodes().get(1);

-		assertEquals("A comment within text.", comment2.getText());

+		// TODO implement Axis.get(int)

+		rootChildren.next();

+		//		final Comment comment2 = (Comment) ((Element) rootChildren.next()).getChildNodes().get(1);

+		//		assertEquals("A comment within text.", comment2.getText());

 

-		final Comment comment3 = (Comment) rootChildNodes.get(2);

+		final Comment comment3 = (Comment) rootChildren.next();

 		assertEquals("Another comment between two child elements.", comment3.getText());

+

+		rootChildren.next();

+		assertFalse(rootChildren.hasNext());

 	}

 }

diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/io/RoundTrip.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/io/RoundTrip.java
index 73689b1..b01901b 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/io/RoundTrip.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/io/RoundTrip.java
@@ -11,9 +11,11 @@
 package org.eclipse.vex.core.internal.io;

 

 import static org.junit.Assert.assertEquals;

+import static org.junit.Assert.assertFalse;

 import static org.junit.Assert.assertTrue;

 

 import java.util.Collection;

+import java.util.Iterator;

 import java.util.List;

 

 import org.eclipse.core.runtime.QualifiedName;

@@ -40,12 +42,11 @@
 

 	public static void assertContentEqual(final Parent expected, final Parent actual) {

 		assertContentRangeEqual(expected, actual);

-		final List<Node> expectedContent = expected.getChildNodes();

-		final List<Node> actualContent = actual.getChildNodes();

-		assertEquals("children of " + expected, expectedContent.size(), actualContent.size());

-		for (int i = 0; i < expectedContent.size(); i++) {

-			final Node expectedNode = expectedContent.get(i);

-			final Node actualNode = actualContent.get(i);

+		final Iterator<Node> expectedChildren = expected.children().iterator();

+		final Iterator<Node> actualChildren = actual.children().iterator();

+		while (expectedChildren.hasNext() && actualChildren.hasNext()) {

+			final Node expectedNode = expectedChildren.next();

+			final Node actualNode = actualChildren.next();

 			assertContentRangeEqual(expectedNode, actualNode);

 			assertEquals(expectedNode.getClass(), actualNode.getClass());

 			expectedNode.accept(new BaseNodeVisitor() {

@@ -65,6 +66,8 @@
 				}

 			});

 		}

+		assertFalse("more children expected", expectedChildren.hasNext());

+		assertFalse("less children expected", actualChildren.hasNext());

 	}

 

 	public static void assertContentRangeEqual(final Node expected, final Node actual) {

diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/io/SpaceNormalizerTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/io/SpaceNormalizerTest.java
index dcaf8ca..c07aec1 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/io/SpaceNormalizerTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/io/SpaceNormalizerTest.java
@@ -16,6 +16,7 @@
 import java.io.InputStream;
 import java.net.URL;
 import java.util.Enumeration;
+import java.util.Iterator;
 import java.util.List;
 
 import javax.xml.parsers.ParserConfigurationException;
@@ -71,7 +72,6 @@
 
 		getAndCreateProject();
 		final Bundle coreTestBundle = Platform.getBundle(VEXCoreTestPlugin.PLUGIN_ID);
-		@SuppressWarnings("unchecked")
 		final Enumeration<String> projectFilePaths = coreTestBundle.getEntryPaths("/" + PROJECT_FILES_FOLDER_NAME);
 		while (projectFilePaths.hasMoreElements()) {
 			final String absolutePath = projectFilePaths.nextElement();
@@ -272,19 +272,20 @@
 	 * brackets, it's assume to refer to the name of an element; otherwise, it represents text content.
 	 */
 	private void assertContent(final Element element, final String... strings) {
-		final List<Node> content = element.getChildNodes();
-		assertEquals(strings.length, content.size());
-		for (int i = 0; i < strings.length; i++) {
-			if (strings[i].startsWith("<")) {
-				final String name = strings[i].substring(1, strings[i].length() - 1);
-				assertTrue(content.get(i) instanceof Element);
-				assertEquals(name, ((Element) content.get(i)).getPrefixedName());
+		final Iterator<Node> children = element.children().iterator();
+		for (final String string : strings) {
+			final Node node = children.next();
+			if (string.startsWith("<")) {
+				final String name = string.substring(1, string.length() - 1);
+				assertTrue(node instanceof Element);
+				assertEquals(name, ((Element) node).getPrefixedName());
 			} else {
-				assertTrue(content.get(i) instanceof Text);
-				final String contentText = content.get(i).getText();
-				assertEquals(strings[i], contentText);
+				assertTrue(node instanceof Text);
+				final String contentText = node.getText();
+				assertEquals(string, contentText);
 			}
 		}
+		assertFalse("more strings expected", children.hasNext());
 	}
 
 	private Document createDocument(final String s, final StyleSheet ss) throws ParserConfigurationException, SAXException, IOException {
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/VexWidgetTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/VexWidgetTest.java
index 022200d..8450e6e 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/VexWidgetTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/VexWidgetTest.java
@@ -16,7 +16,6 @@
 import static org.junit.Assert.assertEquals;
 
 import java.util.Arrays;
-import java.util.List;
 
 import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.vex.core.internal.css.StyleSheet;
@@ -142,10 +141,9 @@
 		final StringBuilder result = new StringBuilder();
 		result.append("<").append(element.getQualifiedName()).append(" (").append(element.getStartOffset()).append("-").append(element.getEndOffset()).append(")");
 		result.append(" ").append(element.getText());
-		final List<Node> children = element.getChildNodes();
-		if (!children.isEmpty()) {
+		if (!element.hasChildren()) {
 			result.append(" [");
-			for (final Node child : children) {
+			for (final Node child : element.children()) {
 				if (child instanceof Element) {
 					result.append(getContentStructure((Element) child));
 				} else if (child instanceof Text) {
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DeepCopy.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DeepCopy.java
index 93beb4c..474ba33 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DeepCopy.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DeepCopy.java
@@ -67,10 +67,10 @@
 		}

 		nodes = new ArrayList<Node>();

 

-		copyNodes(parent.getChildNodes(range), delta);

+		copyNodes(parent.children(range), delta);

 	}

 

-	private void copyNodes(final List<Node> sourceNodes, final int delta) {

+	private void copyNodes(final Iterable<Node> sourceNodes, final int delta) {

 		final DeepCopyVisitor deepCopyVisitor = new DeepCopyVisitor(nodes, content, delta);

 		for (final Node sourceNode : sourceNodes) {

 			sourceNode.accept(deepCopyVisitor);

diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DeepCopyVisitor.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DeepCopyVisitor.java
index 44cf722..9071993 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DeepCopyVisitor.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DeepCopyVisitor.java
@@ -82,7 +82,7 @@
 

 	private void copyChildren(final Parent source, final Parent copy) {

 		final Parent lastParent = currentParent;

-		for (final Node child : source.getChildNodes()) {

+		for (final Node child : source.children()) {

 			currentParent = copy;

 			child.accept(this);

 		}

diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Document.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Document.java
index 3a889cd..327f49f 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Document.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Document.java
@@ -13,6 +13,7 @@
 package org.eclipse.vex.core.internal.dom;
 
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -424,7 +425,7 @@
 	private void associateDeeply(final Node node, final int offset) {
 		if (node instanceof Parent) {
 			final Parent parent = (Parent) node;
-			for (final Node child : parent.getChildNodes()) {
+			for (final Node child : parent.children()) {
 				associateDeeply(child, offset);
 			}
 		}
@@ -524,8 +525,7 @@
 	}
 
 	private static Node findCommonNodeIn(final Parent parent, final int offset1, final int offset2) {
-		final List<Node> children = parent.getChildNodes();
-		for (final Node child : children) {
+		for (final Node child : parent.children()) {
 			if (child instanceof Text) {
 				continue;
 			}
@@ -647,7 +647,11 @@
 	 * @return all nodes in the given range in this document
 	 */
 	public List<Node> getNodes(final ContentRange range) {
-		return getParentOfRange(range).getChildNodes(range);
+		final List<Node> result = new ArrayList<Node>();
+		for (final Node node : getParentOfRange(range).children(range)) {
+			result.add(node);
+		}
+		return result;
 	}
 
 	/*
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DocumentFragment.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DocumentFragment.java
index e6ac8a3..e88cb41 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DocumentFragment.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DocumentFragment.java
@@ -12,6 +12,7 @@
  *******************************************************************************/
 package org.eclipse.vex.core.internal.dom;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.core.runtime.Assert;
@@ -50,14 +51,18 @@
 	 * @return a list with the qualified names off all nodes on the root level of this fragment
 	 */
 	public List<QualifiedName> getNodeNames() {
-		return Node.getNodeNames(getChildNodes());
+		return Node.getNodeNames(children());
 	}
 
 	/**
 	 * @return all nodes on the root level of this fragment
 	 */
 	public List<Node> getNodes() {
-		return getChildNodes();
+		final List<Node> result = new ArrayList<Node>();
+		for (final Node node : children()) {
+			result.add(node);
+		}
+		return result;
 	}
 
 	/**
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Element.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Element.java
index deb0fc2..aa7d67b 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Element.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Element.java
@@ -324,9 +324,8 @@
 	 * @return the child elements of this element
 	 */
 	public List<Element> getChildElements() {
-		final List<Node> nodes = getChildNodes();
 		final List<Element> elements = new ArrayList<Element>();
-		for (final Node node : nodes) {
+		for (final Node node : children()) {
 			node.accept(new BaseNodeVisitor() {
 				@Override
 				public void visit(final Element element) {
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Node.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Node.java
index 39fabdc..4d58141 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Node.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Node.java
@@ -12,7 +12,6 @@
 package org.eclipse.vex.core.internal.dom;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 
 import org.eclipse.core.runtime.Assert;
@@ -244,8 +243,8 @@
 	/**
 	 * @return the qualified names of the given nodes
 	 */
-	public static List<QualifiedName> getNodeNames(final Collection<Node> nodes) {
-		final List<QualifiedName> names = new ArrayList<QualifiedName>(nodes.size());
+	public static List<QualifiedName> getNodeNames(final Iterable<Node> nodes) {
+		final List<QualifiedName> names = new ArrayList<QualifiedName>();
 
 		for (final Node node : nodes) {
 			node.accept(new BaseNodeVisitor() {
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Parent.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Parent.java
index 56eebd7..9eebaa2 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Parent.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Parent.java
@@ -18,6 +18,7 @@
 import java.util.NoSuchElementException;

 

 import org.eclipse.core.runtime.Assert;

+import org.eclipse.vex.core.internal.css.IProperty.Axis;

 

 /**

  * A Parent node is a Node which can contain other nodes as children. This class defines the tree-like structure of the

@@ -85,19 +86,6 @@
 	}

 

 	/**

-	 * Returns a list of all child nodes of this parent node, including Text nodes for the textual content.

-	 * 

-	 * @return all child nodes including Text nodes

-	 */

-	public List<Node> getChildNodes() {

-		if (!isAssociated()) {

-			return Collections.unmodifiableList(children);

-		}

-

-		return getChildNodes(getRange());

-	}

-

-	/**

 	 * Returns a list of all child nodes (including Text nodes) in the given range. The Text nodes are cut at the edges,

 	 * all other nodes must be fully contained in the range (i.e. the start tag and the end tag). The returned list is

 	 * not modifyable.

@@ -108,7 +96,7 @@
 	 *            the end offset of the range

 	 * @return all child nodes which are completely within the given range plus the textual content

 	 */

-	public List<Node> getChildNodes(final ContentRange range) {

+	private List<Node> getChildNodes(final ContentRange range) {

 		final List<Node> result = new ArrayList<Node>();

 

 		for (final Node child : children(range)) {

@@ -158,6 +146,10 @@
 		return children.size();

 	}

 

+	/**

+	 * @see Axis

+	 * @return the iterable children Axis of this node.

+	 */

 	public Iterable<Node> children() {

 		if (!isAssociated()) {

 			return Collections.unmodifiableList(children);

@@ -195,13 +187,12 @@
 	}

 

 	/**

-	 * Indicates whether this parent node has child nodes. Text nodes are ignored, i.e. this method will return false if

-	 * this parent node contains only text.

+	 * Indicates whether this parent node has child nodes, including text nodes.

 	 * 

-	 * @return true if this parent node has any child nodes besides text

+	 * @return true if this parent node has any child nodes

 	 */

 	public boolean hasChildren() {

-		return !children.isEmpty();

+		return children().iterator().hasNext();

 	}

 

 	private class ChildrenAndText implements Iterator<Node> {

diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/io/DocumentWriter.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/io/DocumentWriter.java
index c4d83f4..17b4960 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/io/DocumentWriter.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/io/DocumentWriter.java
@@ -180,7 +180,7 @@
 					out.println(buffer.toString());
 				}
 
-				for (final Node child : document.getChildNodes()) {
+				for (final Node child : document.children()) {
 					writeNode(child, out, indent);
 				}
 			}
@@ -188,7 +188,7 @@
 			@Override
 			public void visit(final DocumentFragment fragment) {
 				out.print("<vex_fragment>");
-				for (final Node child : fragment.getChildNodes()) {
+				for (final Node child : fragment.children()) {
 					writeNodeNoWrap(child, out);
 				}
 				out.println("</vex_fragment>");
@@ -236,7 +236,7 @@
 					out.println(">");
 
 					final String childIndent = indent + DocumentWriter.this.indent;
-					for (final Node child : element.getChildNodes()) {
+					for (final Node child : element.children()) {
 						writeNode(child, out, childIndent);
 					}
 					out.print(indent);
@@ -298,7 +298,7 @@
 				out.print(getAttributeString(element));
 				out.print(">");
 
-				for (final Node child : element.getChildNodes()) {
+				for (final Node child : element.children()) {
 					writeNodeNoWrap(child, out);
 				}
 
@@ -337,24 +337,25 @@
 		node.accept(new BaseNodeVisitor() {
 			@Override
 			public void visit(final Element element) {
-				final List<Node> content = element.getChildNodes();
+				final boolean elementHasChildren = element.hasChildren();
 
 				final StringBuilder buffer = new StringBuilder();
 				buffer.append("<").append(element.getPrefixedName());
 				buffer.append(getNamespaceDeclarationsString(element));
 				buffer.append(getAttributeString(element));
-				if (content.isEmpty()) {
-					buffer.append("/>");
-				} else {
+
+				if (elementHasChildren) {
 					buffer.append(">");
+				} else {
+					buffer.append("/>");
 				}
 				wrapper.addNoSplit(buffer.toString());
 
-				for (final Node child : content) {
+				for (final Node child : element.children()) {
 					addNode(child, wrapper);
 				}
 
-				if (!content.isEmpty()) {
+				if (elementHasChildren) {
 					wrapper.add("</" + element.getPrefixedName() + ">");
 				}
 			}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/AbstractBlockBox.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/AbstractBlockBox.java
index 3aae0c8..129dbe6 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/AbstractBlockBox.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/AbstractBlockBox.java
@@ -872,8 +872,7 @@
 	 *            The offset at which to end the search.
 	 */
 	private static Node findNextBlockNode(final LayoutContext context, final Parent parent, final int startOffset, final int endOffset) {
-		final List<Node> children = parent.getChildNodes(new ContentRange(startOffset, endOffset));
-		for (final Node child : children) {
+		for (final Node child : parent.children(new ContentRange(startOffset, endOffset))) {
 			final Node nextBlockNode = child.accept(new BaseNodeVisitorWithResult<Node>() {
 				@Override
 				public Node visit(final Element element) {
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/InlineElementBox.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/InlineElementBox.java
index 66421bf..a5884e2 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/InlineElementBox.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/InlineElementBox.java
@@ -272,7 +272,7 @@
 		node.accept(new BaseNodeVisitor() {
 			@Override
 			public void visit(final Element element) {
-				for (final Node childNode : element.getChildNodes(range)) {
+				for (final Node childNode : element.children(range)) {
 					childNode.accept(new BaseNodeVisitor() {
 						@Override
 						public void visit(final Element element) {
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/VexWidgetImpl.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/VexWidgetImpl.java
index 3c175ad..7ede339 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/VexWidgetImpl.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/VexWidgetImpl.java
@@ -319,7 +319,7 @@
 		}
 
 		final List<QualifiedName> seq1 = Node.getNodeNames(parent.getChildNodesBefore(element.getStartOffset()));
-		final List<QualifiedName> seq2 = Node.getNodeNames(element.getChildNodes());
+		final List<QualifiedName> seq2 = Node.getNodeNames(element.children());
 		final List<QualifiedName> seq3 = Node.getNodeNames(parent.getChildNodesAfter(element.getEndOffset()));
 
 		return validator.isValidSequence(parent.getQualifiedName(), seq1, seq2, seq3, true);
@@ -624,7 +624,7 @@
 
 		final List<QualifiedName> nodesBefore = Node.getNodeNames(parent.getChildNodesBefore(startOffset));
 		final List<QualifiedName> nodesAfter = Node.getNodeNames(parent.getChildNodesAfter(endOffset));
-		final List<QualifiedName> selectedNodes = Node.getNodeNames(parent.getChildNodes(new ContentRange(startOffset, endOffset)));
+		final List<QualifiedName> selectedNodes = Node.getNodeNames(parent.children(new ContentRange(startOffset, endOffset)));
 		final List<QualifiedName> candidates = createCandidatesList(validator, parent, Validator.PCDATA);
 
 		filterInvalidSequences(validator, parent, nodesBefore, nodesAfter, candidates);
@@ -713,7 +713,7 @@
 		final List<QualifiedName> candidates = createCandidatesList(validator, parent, Validator.PCDATA, element.getQualifiedName());
 
 		// root out those that can't contain the current content
-		final List<QualifiedName> content = Node.getNodeNames(element.getChildNodes());
+		final List<QualifiedName> content = Node.getNodeNames(element.children());
 
 		for (final Iterator<QualifiedName> iter = candidates.iterator(); iter.hasNext();) {
 			final QualifiedName candidate = iter.next();
diff --git a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/VexHandlerUtil.java b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/VexHandlerUtil.java
index ac0d04f..079a9d5 100644
--- a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/VexHandlerUtil.java
+++ b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/VexHandlerUtil.java
@@ -254,8 +254,7 @@
 
 		int previousSiblingStart = -1;
 		final Element parent = vexWidget.getDocument().getElementForInsertionAt(startOffset);
-		final List<Node> children = parent.getChildNodes();
-		for (final Node child : children) {
+		for (final Node child : parent.children()) {
 			if (startOffset == child.getStartOffset()) {
 				break;
 			}