(Recursive?)正则表达式删除空的xml标签

时间:2015-11-25 14:32:56

标签: regex xml recursion tags magic-unipaas

我想从xml文件中删除所有空标记。但是,我的选项非常有限,所以我想使用一个正则表达式(这里有可用的内部知识)。

我没有问题正则表达式删除变体中的空标记,但嵌套的空标记有点难,因为我的正则表达式只会深入一个。

我相信这是因为我递归中的命名捕获组,但我无法解决它。

这是我到目前为止所做的:here

致以最诚挚的问候和谢谢,

劳伦

1 个答案:

答案 0 :(得分:0)

试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml = 
                "<root>" +
                    "<tag1>Good</tag1>" +
                    "<tag2 element=\"Good\"></tag2>" +
                    "<tag3 element=\"Good\" />" +
                    "<tag4></tag4>" +
                    "<tag13>" +
                    "</tag13>" +
                    "<tag5 />" +
                    "<tag6/>" +
                    "<tag7>" +
                        "<tag7.1>good</tag7.1>" +
                    "</tag7>" +
                    "<tag8>" +
                        "<tag8.1></tag8.1>" +
                    "</tag8>" +
                    "<tag9>" +
                        "<tag9.1 />" +
                    "</tag9>" +
                    "<tag10>" +
                        "<tag10.1/>" +
                    "</tag10>" +
                    "<tag10>" +
                        "<tag10.1>Wel iets</tag10.1>" +
                    "</tag10>" +
                    "<tag11>" +
                        "<tag11.1 element=\"Good\"/>" +
                    "</tag11>" +
                    "<tag12>" +
                        "<tag12.1></tag12.1>" +
                        "<tag12.2>" +
                            "<tag12.2.1></tag12.2.1>" +
                        "</tag12.2>" +
                    "</tag12>" +
                    "</root>";
            XElement root = XElement.Parse(xml);
            var deleteElements = root.Descendants().Where(x => (x.Descendants().Count() == 0) && (x.Attributes().Count() == 0) && (x.Value.Length == 0)).ToList();
            foreach (XElement deleteElement in deleteElements)
            {
                deleteElement.Remove();
            }
        }
    }
}
​