2009-12-04 63 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