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