diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index fe28c01412..cb2eb20738 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -8,6 +8,10 @@
+
+ asXml(): emit formatting line breaks only where the document contains whitespace;
+ adjacent elements no longer gain a fabricated line break that renders as a space.
+
Many, many javadoc improvements.
diff --git a/src/main/java/org/htmlunit/html/DomElement.java b/src/main/java/org/htmlunit/html/DomElement.java
index e3daafa9a1..9178034dd4 100644
--- a/src/main/java/org/htmlunit/html/DomElement.java
+++ b/src/main/java/org/htmlunit/html/DomElement.java
@@ -362,7 +362,7 @@ protected boolean printXml(final String indent, final boolean tagBefore, final P
if (hasChildren) {
printWriter.print(">");
- final boolean tag = printChildrenAsXml(indent, true, printWriter);
+ final boolean tag = printChildrenAsXml(indent, false, printWriter);
if (tag) {
printWriter.print("\r\n");
printWriter.print(indent);
@@ -380,7 +380,7 @@ else if (isEmptyXmlTagExpanded()) {
printWriter.print("/>");
}
- return true;
+ return false;
}
/**
diff --git a/src/main/java/org/htmlunit/html/DomText.java b/src/main/java/org/htmlunit/html/DomText.java
index 2f27a88462..2dc140b231 100644
--- a/src/main/java/org/htmlunit/html/DomText.java
+++ b/src/main/java/org/htmlunit/html/DomText.java
@@ -141,6 +141,9 @@ protected boolean printXml(final String indent, final boolean tagBefore, final P
printWriter.print(data);
tag = false;
}
+ else if (data != null && !data.isEmpty()) {
+ tag = true;
+ }
return printChildrenAsXml(indent, tag, printWriter);
}
diff --git a/src/test/java/org/htmlunit/WebClient8Test.java b/src/test/java/org/htmlunit/WebClient8Test.java
index 195cd6b258..3b4f0ecb95 100644
--- a/src/test/java/org/htmlunit/WebClient8Test.java
+++ b/src/test/java/org/htmlunit/WebClient8Test.java
@@ -59,15 +59,45 @@ public void asXml() throws Exception {
try (WebClient webClient = new WebClient(getBrowserVersion(), false, null, -1)) {
final HtmlPage page = loadPage(webClient, html, null, URL_FIRST);
- assertEquals("\r\n\r\n"
- + " \r\n"
- + " foo\r\n"
- + " \r\n"
- + " \r\n"
- + " Hello HtmlUnit\r\n"
- + "
\r\n"
- + " \r\n"
- + "",
+ assertEquals("\r\n"
+ + "foo"
+ + "Hello HtmlUnit
",
+ page.asXml());
+ }
+ }
+
+ /**
+ * @throws Exception if something goes wrong
+ */
+ @Test
+ public void asXmlNoWhitespaceBetweenAdjacentElements() throws Exception {
+ final String html = DOCTYPE_HTML
+ + "foo"
+ + "ab
";
+
+ try (WebClient webClient = new WebClient(getBrowserVersion(), false, null, -1)) {
+ final HtmlPage page = loadPage(webClient, html, null, URL_FIRST);
+ assertEquals("\r\n"
+ + "foo"
+ + "ab
",
+ page.asXml());
+ }
+ }
+
+ /**
+ * @throws Exception if something goes wrong
+ */
+ @Test
+ public void asXmlWhitespaceOnlyTextBetweenElements() throws Exception {
+ final String html = DOCTYPE_HTML
+ + "foo"
+ + "a b
";
+
+ try (WebClient webClient = new WebClient(getBrowserVersion(), false, null, -1)) {
+ final HtmlPage page = loadPage(webClient, html, null, URL_FIRST);
+ assertEquals("\r\n"
+ + "foo"
+ + "a\r\n b
",
page.asXml());
}
}
diff --git a/src/test/java/org/htmlunit/html/HtmlFormTest.java b/src/test/java/org/htmlunit/html/HtmlFormTest.java
index 93d27f15aa..8ac393446e 100644
--- a/src/test/java/org/htmlunit/html/HtmlFormTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlFormTest.java
@@ -1199,13 +1199,8 @@ public void asXml_emptyTag() throws Exception {
final String xml =
"\r\n"
- + "\r\n"
- + " \r\n"
- + " \r\n"
- + " \r\n"
- + " test
\r\n"
- + " \r\n"
- + "";
+ + "\r\n \r\n test
\r\n"
+ + " ";
final HtmlPage page = loadPage(html);
assertEquals(xml, page.asXml());
diff --git a/src/test/java/org/htmlunit/html/HtmlNoScript2Test.java b/src/test/java/org/htmlunit/html/HtmlNoScript2Test.java
index 0645c5d75b..5a54191440 100644
--- a/src/test/java/org/htmlunit/html/HtmlNoScript2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlNoScript2Test.java
@@ -34,8 +34,7 @@ public class HtmlNoScript2Test extends SimpleWebTestCase {
*/
@Test
@Alerts("\r\n"
- + " \r\n"
- + "")
+ + " ")
public void asXml_jsEnabled() throws Exception {
final String html = DOCTYPE_HTML
+ "\n"
@@ -57,10 +56,7 @@ public void asXml_jsDisabled() throws Exception {
+ "";
final String expected = "\r\n"
- + " \r\n"
- + "";
+ + " ";
final WebClient client = getWebClient();
client.getOptions().setJavaScriptEnabled(false);
diff --git a/src/test/java/org/htmlunit/html/HtmlOrderedListTest.java b/src/test/java/org/htmlunit/html/HtmlOrderedListTest.java
index e840b46f1b..994daacb8d 100644
--- a/src/test/java/org/htmlunit/html/HtmlOrderedListTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlOrderedListTest.java
@@ -70,12 +70,8 @@ public void asXml() throws Exception {
// assertEquals("
", element.asXml());
assertEquals("\r\n"
- + "\r\n"
- + " \r\n"
- + "
\n"
+ + "\r\n
\n"
+ "foo\n"
- + "\r\n"
- + "", page.asXml());
+ + "", page.asXml());
}
}
diff --git a/src/test/java/org/htmlunit/html/HtmlPageTest.java b/src/test/java/org/htmlunit/html/HtmlPageTest.java
index 9835fa088b..b874be1bb3 100644
--- a/src/test/java/org/htmlunit/html/HtmlPageTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlPageTest.java
@@ -1042,14 +1042,9 @@ public void asXml_noscript() throws Exception {
+ "