diff --git a/src/AngleSharp.Core.Tests/Library/XhtmlFormatter.cs b/src/AngleSharp.Core.Tests/Library/XhtmlFormatter.cs
new file mode 100644
index 000000000..5dfc2ee28
--- /dev/null
+++ b/src/AngleSharp.Core.Tests/Library/XhtmlFormatter.cs
@@ -0,0 +1,55 @@
+using AngleSharp.Xhtml;
+using NUnit.Framework;
+
+namespace AngleSharp.Core.Tests.Library
+{
+ [TestFixture]
+ public class XhtmlFormatter
+ {
+ [Test]
+ public void XhtmlMarkupFormatter_DoesNotFormatEmptyElementsToSelfClosing_WhenEmptyTagsToSelfClosingIsFalse()
+ {
+ var formatter = new XhtmlMarkupFormatter(false);
+ var input = "" +
+ "
" +
+ "" +
+ "test
" +
+ "" +
+ "" +
+ "" +
+ "";
+ var doc = input.ToHtmlDocument();
+
+ var res = doc.ToHtml(formatter);
+
+ Assert.AreEqual(input, res);
+ }
+
+ [Test]
+ public void XhtmlMarkupFormatter_FormatsEmptyElementsToSelfClosing_WhenEmptyTagsToSelfClosingIsTrue()
+ {
+ var formatter = new XhtmlMarkupFormatter(true);
+ var input = "" +
+ "" +
+ "" +
+ "test
" +
+ "" +
+ "" +
+ "" +
+ "";
+ var expected = "" +
+ "" +
+ "test
" +
+ "" +
+ "" +
+ "" +
+ "";
+ var doc = input.ToHtmlDocument();
+
+ var res = doc.ToHtml(formatter);
+
+ Assert.AreEqual(expected, res);
+ }
+ }
+}
diff --git a/src/AngleSharp/Xhtml/XhtmlMarkupFormatter.cs b/src/AngleSharp/Xhtml/XhtmlMarkupFormatter.cs
index 84558715d..762d91cba 100644
--- a/src/AngleSharp/Xhtml/XhtmlMarkupFormatter.cs
+++ b/src/AngleSharp/Xhtml/XhtmlMarkupFormatter.cs
@@ -18,6 +18,34 @@ public class XhtmlMarkupFormatter : IMarkupFormatter
#endregion
+ #region Constructors
+
+ ///
+ /// Default constructor for
+ ///
+ public XhtmlMarkupFormatter() : this(true)
+ {
+
+ }
+
+ ///
+ /// Constructor for
+ ///
+ /// Specify if empty elements like <div></div>
+ /// should be converted to self-closing ones like <div/>
+ public XhtmlMarkupFormatter(Boolean emptyTagsToSelfClosing)
+ {
+ _emptyTagsToSelfClosing = emptyTagsToSelfClosing;
+ }
+
+ #endregion
+
+ #region Private fields
+
+ private readonly Boolean _emptyTagsToSelfClosing;
+
+ #endregion
+
#region Methods
///
@@ -26,7 +54,7 @@ public virtual String CloseTag(IElement element, Boolean selfClosing)
var prefix = element.Prefix;
var name = element.LocalName;
var tag = !String.IsNullOrEmpty(prefix) ? prefix + ":" + name : name;
- return (selfClosing || !element.HasChildNodes) ? String.Empty : String.Concat("", tag, ">");
+ return (selfClosing || _emptyTagsToSelfClosing && !element.HasChildNodes) ? String.Empty : String.Concat("", tag, ">");
}
///
@@ -64,7 +92,7 @@ public virtual String OpenTag(IElement element, Boolean selfClosing)
temp.Append(' ').Append(Attribute(attribute));
}
- if (selfClosing || !element.HasChildNodes)
+ if (selfClosing || _emptyTagsToSelfClosing && !element.HasChildNodes)
{
temp.Append(" /");
}