我有一个奇怪的要求,即我的应用程序生成的消耗一些XML的应用程序实际上需要将空元素序列化为父元素。例如:
<element foo="bar" />
应该是:
<element foo="bar"></element>
我不知道XmlSerializer允许你改变它的任何方式。有人知道如何做到这一点吗?
答案 0 :(得分:4)
我扩展了XmlTextWriter,以便我可以覆盖WriteEndElement()方法,强制它调用WriteFullEndElement()。这就行了。
注意:对于看到我的问题更新的任何人,请忽略。 IE以简写形式呈现XML。当我在记事本中打开它时,我意识到一切正常。
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();
}
}
答案 1 :(得分:0)
您可以使用正则表达式解决它,使其成为两遍过程。
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);
答案 2 :(得分:0)
Scott Hanselman在一段时间内写了一篇关于stripping out empty elements来自XML的文章,一目了然,代码可以用于您的目的,只需对空元素的处理进行一些小改动。他还解释了为什么使用RegEx是一个坏主意。
我指出这一点,因为我不知道如何让XmlSerializer做你想做的事。
另一种可能性,虽然我对WPF并不是很了解,但是使用XAML序列化程序 - 请查看System.Window.Markup命名空间文档。