2

我有一个未格式化的 xml 文件,我想在其中删除包含某些值的特定名称的标签。

例子:

<XmlElement1>
</XmlElement1>
<XmlElement2 ... >
   ...
   <Xml1SubElement someParameter="...SearchTerm..."/>
   ...
</XmlElement2>
<XmlElement3/>

... 代表随机字符和随机多行

在上面的示例中,我想删除正文中包含“SearchTerm”的所有 XmlElement2 元素。换句话说,选择位于中间的多行之间<XmlElement2</XmlElement2>跨多行的所有文本SearchTerm并替换为“”。

我在 MacOS 上使用 UltraEdit,并且可以灵活地使用哪些工具。

非常感谢您的帮助!

4

1 回答 1

2

此任务的Perl正则表达式搜索字符串可以是例如:

(?s)^[\t ]*<XmlElement2(?:.(?!</XmlElement2>))+?SearchTerm.+?</XmlElement2>[\t ]*(?:\r?\n|\r)

解释:

(?s)... 标志以在搜索表达式中也通过点匹配换行符。

^[\t ]*...从行首开始搜索并匹配 0 个或多个制表符或空格。

<XmlElement2...要在包含时删除的元素的开始标记SearchTerm

(?:.(?!</XmlElement2>))+?...一个非标记组,只要当前字符之后的字符串不是,就可以一次或多次非贪婪地查找任何字符</XmlElement2>。负前瞻(?!</XmlElement2>)阻止选择以任何内容开头<XmlElement2并匹配任何内容的块,包括一个甚至多个标签,直到</XmlElement2>在文件中的任何位置找到。<XmlElement2SearchTerm

SearchTerm... 必须在 element 中找到的字符串XmlElement2

.+?...任何字符(包括换行符)一次或多次非贪婪。非贪婪意味着在文件中的下一次出现</XmlElement2>而不是最后一次出现时停止匹配字符</XmlElement2>

</XmlElement2>... 要删除的 XML 元素的结束标记包含SearchTerm.

[\t ]*(?:\r?\n|\r)... 0 个或多个制表符或空格以及 DOS/Windows(回车 + 换行)或 UNIX(仅换行)或 MAC(仅回车)行结尾。

PS:Perl 正则表达式替换在 Windows XP 上使用 UltraEdit for Windows v22.20.0.49 和在 Windows 7 上使用 v25.20.0.88 进行了测试,因为我没有 Mac。

于 2019-01-03T10:14:46.527 回答