I have a strange requirement where an application consuming some XML that my application is generating actually needs empty elements to be serialized as parent elements. For exa
Scott Hanselman wrote a while back an article about stripping out empty elements from XML, and at a glance the code can be used for your purpose with a small alteration to the treatment of empty elements. He also explains why using RegEx is a bad idea.
I am pointing this out, as I don't know of a way to get XmlSerializer to do what you want.
Another possibility, though I don't really know much about WPF is using the XAML serializer - look at the System.Window.Markup namespace documentation.
I extended XmlTextWriter so that I could override the WriteEndElement() method, forcing it to call WriteFullEndElement(). This did the trick.
Note: for anybody that saw my question update, please ignore. IE was rendering the XML in the shorthand form. As soon as I opened it in Notepad, I realized everything was working fine.
public class FullEndingXmlTextWriter : XmlTextWriter
{
public FullEndingXmlTextWriter(TextWriter w)
: base(w)
{
}
public FullEndingXmlTextWriter(Stream w, Encoding encoding)
: base(w, encoding)
{
}
public FullEndingXmlTextWriter(string fileName, Encoding encoding)
: base(fileName, encoding)
{
}
public override void WriteEndElement()
{
this.WriteFullEndElement();
}
}
You could solve it with a regular expression, making it a two-pass process.
string xml = "element foo=\"bar\" />"
string pattern = @"<(?<elem>\w+)(?<body>\b.*)/>";
string substitute = @"<${elem} ${body}></${elem}>";
Regex regex = new Regex(pattern);
string goodresult = regex.Replace(xml, substitute);