2009-12-04 66 views
1

我有一个奇怪的需求,那就是当我的应用程序正在生成一些XML的应用程序实际上需要空元素作为父元素进行序列化时。例如:将空的XML元素渲染为父元素

<element foo="bar" />

应该是:

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

我不知道有任何方式的让你改变这种情况。有人知道如何做到这一点?

+1

看起来像有人推出了自己的XML“解析”;) – sfussenegger 2009-12-04 19:44:05

+0

是......这可能就是发生了什么事。这很令人沮丧。 – senfo 2009-12-04 19:55:47

+0

如果你告诉他们“不”,会发生什么情况,并要求他们遵循国际标准而不是发明自己的标准? – 2009-12-05 00:11:05

回答

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(); 
    } 
}
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); 
0

斯科特Hanselman的写了一段时间后一篇文章里,XML约stripping out empty elements,一目了然的代码可以用于你的目的有一个小改动空元素的处理。他还解释了为什么使用RegEx是一个坏主意。

我指出了这一点,因为我不知道如何让XmlSerializer执行您想要的操作。

另一种可能性,虽然我对WPF了解不多,但使用XAML序列化程序 - 请参阅System.Window.Markup命名空间文档。

+0

是的,看起来Scott Hanselman已经找到了一个非常优化的解决方案(针对另一个问题),即使在这种情况下XSLT转换可能会更容易,如果速度不是主要关心的话。然而,我不会分享他对RegEx的看法,显然他们已经使用了多年。 ;-) – 2009-12-05 08:17:55