2009-11-11 95 views
2

我想在下面的XML閱讀:XML縮減大小在.NET

<node></node> 

然後寫出來,精縮,像這樣:

<node/> 

顯然,這具有相同的含義,但第二個文件在通過電線發送時較小。

我試圖找到一種方法在.NET中做到這一點。我似乎無法找到將放棄不必要的關閉標籤的選項或設置。

建議?

+0

+1。好問題。 – David 2009-11-11 16:14:45

回答

0

如果您使用LINQ to XML,則可以撥打XElement.RemoveNodes()將其轉換爲第二種形式。因此,像這樣:

var emptyTags = doc.Descendants().Where(x => !x.Nodes().Any()).ToList(); 

foreach (XElement tag in emptyTags) 
{ 
    tag.RemoveNodes(); 
} 

然後將文檔保存在正常的方式,我覺得會做你想要什麼......

0

看看的的XmlElement IsEmpty財產。

+0

的IsEmpty只會告訴我,如果節點有子女或沒有。如果我將它設置爲true,它將刪除子元素。 – nikmd23 2009-11-11 16:18:21

+0

對於包含子節點的節點,請勿將其設置爲true,但如果將其設置爲true以表示空節點,則會使用短格式對其進行序列化。 – zac 2009-11-11 16:21:25

+0

so: if(x.IsEmpty)x.IsEmpty = true; ?這似乎有點不對。 – nikmd23 2009-11-11 16:24:41

1

您可以將XML複製到一個新的結構。

public static XElement Minify(XElement element) { 
    return new XElement(element.Name, element.Attributes(), 
     element.Nodes().Select(node => { 
      if (node is XElement) 
       return Minify((XElement)node); 
      return node; 
     }) 
    ); 
} 

這裏是另一個解決方案,但LINQ少http://social.msdn.microsoft.com/Forums/en-US/xmlandnetfx/thread/e1e881db-6547-42c4-b379-df5885f779be

XmlDocument doc = new XmlDocument(); 
doc.PreserveWhitespace = true; 
doc.Load("input.xml"); 
foreach (XmlElement el in 
    doc.SelectNodes("descendant::*[not(*) and not(normalize-space())]")) 
{ 
    el.IsEmpty = true; 
} 
doc.Save("output.xml"); 
0

嘗試使用選項WebMarkupMin XML Minifier 「摺疊標籤沒有內容」:

 const string xmlInput = "<row RoleId=\"4\" RoleName=\"Administrator\"></row>\n" + 
     "<row RoleId=\"5\" RoleName=\"Contributor\"></row>\n" + 
     "<row RoleId=\"6\" RoleName=\"Editor\"></row>" 
     ; 

    var xmlMinifier = new XmlMinifier(
     new XmlMinificationSettings{ CollapseTagsWithoutContent = true }); 

    MarkupMinificationResult result = xmlMinifier.Minify(xmlInput); 

    Console.WriteLine("Minified content:{0}{0}{1}", 
     Environment.NewLine, result.MinifiedContent);