我有一個奇怪的需求,那就是當我的應用程序正在生成一些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