将空XML元素渲染为父元素

时间:2009-12-04 19:41:54

标签: c# xml-serialization

我有一个奇怪的要求,即我的应用程序生成的消耗一些XML的应用程序实际上需要将空元素序列化为父元素。例如:

<element foo="bar" />

应该是:

<element foo="bar"></element>

我不知道XmlSerializer允许你改变它的任何方式。有人知道如何做到这一点吗?

3 个答案:

答案 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命名空间文档。

相关问题