2009-11-11 90 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);