我有一个文件,里面有很多xml节点,它们用id链接在一起。我需要更改节点的id和链接。
<event id="12345">
<action>6789</action>
</event>
<action id="6789">
<name>pre-filter1</name>
<someotherlink>45678</someotherlink>
</action>
我需要更改操作节点的id和从何处链接的引用。我之所以研究regex,是因为我必须为一些只有特定名称的操作节点做这件事,比如这里的预过滤器。在替换为新值之前,需要通过一些逻辑处理id。节点的顺序是随机的。我只需要为整个文件做一次,任何方式都可以。时间复杂性也不是限制。
感谢您的帮助。
Perl支持在替换正则表达式时使用函数。不确定其他语言。
如果您不使用perl,您可以执行以下操作:
1( 使用以下正则表达式获取给定名称的所有操作ID:
<actions*id="(d+)">(?=[^=]*<name>pre-filterd</name>).*?</action>
https://regex101.com/r/Q7lKgx/1
2( 转换值并将原始id和转换后的值存储在哈希中。
3( 循环散列并使用regexp将id替换为新值
这与操作和操作id:都匹配
(<action(?:s*id="|>))(THE_ID)("|</action)> ==> replace with 1NEW_ID3
无论如何,用正则表达式解析XML通常不是一个好主意,所以最好使用一些库来解析XML。