使用与序列匹配两次的正则表达式从xml中移除空元素

我期望从XML文件中删除空元素,因为阅读器需要一个值。 它不是无xsi:nil="true"或没有内容的<Element />在C#中用空元素反序列化Xml。 但元素内部部分完全缺少<Element></Element>

我已经尝试编写我自己的代码来删除这些元素,但是我的代码太慢,文件太大。 每个项目的结尾还将包含此模式。 所以下面的正则表达式会删除有效的xml:
@"<.*></*>

我需要某种正则表达式来确保这两个*的模式是相同的。

所以:

<Item><One>1</One><Two></Two><Three>3</Three></Item>

会变成:

<Item><One>1</One><Three>3</Three></Item>

所以这一切都是一条线的事实让这变得更加困难,因为这意味着物品的末端恰好在三之后结束,产生了我想要寻找的模式。

我无法访问允许重新创建有效xml的原始数据。


您要在< ... >内捕获一个或多个单词字符
并通过使用1反向引用来匹配第一组捕获的结束标记。

<(w+)></1>

请参阅regex101上的演示


AFAIK 没有必要捕获任何组,因为<a></b> (它会匹配一个简单的正则表达式而不捕获)只是无效的XML ,它不能在你的文件中(除非你在这种情况下解析HTML - 即使可以完成 - 我建议不要使用正则表达式)。 仅当您匹配非空节点时才需要捕获组,但这不是您的情况。

请注意,你的正则表达式有问题(除了未转义的/),因为你正在匹配任何字符。 但不允许在XML标签中包含任何字符。 如果你绝对想使用.*那么它应该是.*? 你应该排除/)。

我会做的是保持regex尽可能简单(仍然匹配有效的XML节点名称 - 甚至更好 - 只有你知道的是你的数据输入):

<w+></w+>

您应该/可能会更好地检查标记名称,例如s*[wd]+s*可能稍微好一些,使用较少步骤的正则表达式对于非常大的文件执行效果更好 。 你也可以在开始和结束标签之间添加一个可选的新行。

请注意,您可能需要循环,直到没有更多的替换完成,例如,如果您有<outer><inner></inner></outer>并且希望将其还原为空字符串(特别是在这种情况下不要忘记编译你的正则表达式)。


使用XML Linq

string xml = "<Item><One>1</One><Two></Two><Three>3</Three></Item>";
            XElement item = XElement.Parse(xml);
            item = new XElement("Item", item.Descendants().Where(x => x.Value.Length != 0));
链接地址: http://www.djcxy.com/p/66005.html

上一篇: Removing empty elements from xml with regex that matches a sequence twice

下一篇: .NET, XML and comments in InnerXml