代码之家  ›  专栏  ›  技术社区  ›  nikmd23

NET中的XML缩小

  •  2
  • nikmd23  · 技术社区  · 15 年前

    我想阅读以下XML:

    <node></node>
    

    然后写出来,缩小,像这样:

    <node/>
    

    显然,这具有相同的含义,但第二个文件较小,用于跨线发送。

    我正试图找到一种在.NET中实现这一点的方法。我似乎找不到一个选项或设置会删除不必要的结束标记。

    建议?

    5 回复  |  直到 15 年前
        1
  •  1
  •   Bob    15 年前

    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;
            })
        );
    }
    

    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");
    
        2
  •  0
  •   Jon Skeet    15 年前

    如果使用LINQ to XML,可以调用 XElement.RemoveNodes() 将其转换为第二种形式。比如说:

    var emptyTags = doc.Descendants().Where(x => !x.Nodes().Any()).ToList();
    
    foreach (XElement tag in emptyTags)
    {
        tag.RemoveNodes();
    }
    

    然后以正常方式保存文档,然后 它会做你想做的。。。

        3
  •  0
  •   zac    15 年前

    看一看XmlElement IsEmpty 财产。

        4
  •  0
  •   David    15 年前

    我自己没有测试过,但您是否尝试过使用XmlWriter的 XmlWriterSettings.OutputMethod 财产?

    http://msdn.microsoft.com/en-us/library/system.xml.xmloutputmethod.aspx

        5
  •  0
  •   Andrey Taritsyn    12 年前

    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);