使用与序列匹配两次的正则表达式从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