我有一个奇怪的需求,那就是当我的应用程序正在生成一些XML的应用程序实际上需要空元素作为父元素进行序列化时。例如:将空的XML元素渲染为父元素
<element foo="bar" />
应该是:
<element foo="bar"></element>
我不知道有任何方式的让你改变这种情况。有人知道如何做到这一点?
我有一个奇怪的需求,那就是当我的应用程序正在生成一些XML的应用程序实际上需要空元素作为父元素进行序列化时。例如:将空的XML元素渲染为父元素
<element foo="bar" />
应该是:
<element foo="bar"></element>
我不知道有任何方式的让你改变这种情况。有人知道如何做到这一点?
我扩展了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();
}
}
你可以用一个正则表达式来解决它,使它成为一个双向过程。
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);
斯科特Hanselman的写了一段时间后一篇文章里,XML约stripping out empty elements,一目了然的代码可以用于你的目的有一个小改动空元素的处理。他还解释了为什么使用RegEx是一个坏主意。
我指出了这一点,因为我不知道如何让XmlSerializer执行您想要的操作。
另一种可能性,虽然我对WPF了解不多,但使用XAML序列化程序 - 请参阅System.Window.Markup命名空间文档。
是的,看起来Scott Hanselman已经找到了一个非常优化的解决方案(针对另一个问题),即使在这种情况下XSLT转换可能会更容易,如果速度不是主要关心的话。然而,我不会分享他对RegEx的看法,显然他们已经使用了多年。 ;-) – 2009-12-05 08:17:55
看起来像有人推出了自己的XML“解析”;) – sfussenegger 2009-12-04 19:44:05
是......这可能就是发生了什么事。这很令人沮丧。 – senfo 2009-12-04 19:55:47
如果你告诉他们“不”,会发生什么情况,并要求他们遵循国际标准而不是发明自己的标准? – 2009-12-05 00:11:05