正则表达式替换节点属性内容

时间:2011-09-15 10:35:56

标签: regex replace

我有一个xml文档,如下所示:

<nodes> <node idName="employee">Some Text Here "employee" idName="employee" employee<innderNode idName="manager">Some Manager Text Here manager manager "manager" </innerNode> </node> </nodes>

如何将“employee”替换为“supervisor”并将“manager”替换为“employee”仅在属性中?

谢谢, 克

2 个答案:

答案 0 :(得分:0)

正则表达式无法处理XML所属的语言类。然而,当然有一种hacky方式:

  • 您可以匹配idName="something" - 包括等号和引号 - 并将其替换为idName="somethingelse"

但是,当上面显示的确切字符串确定不会在任何XML元素主体中显示为文本时,这当然有效。如果是这种情况,那么就没有办法引导正确的XML解析器。

虽然现代正则表达式通常可以处理超过常规语言,但只能处理这么多。您将需要一个无上下文语法来解析XML。

答案 1 :(得分:0)

我同意在理想的世界中,您应该使用正确的XML解析器。

然而,世界并不理想,正如你需要的那样,正则表达式可以解决这个问题。 这是一个可以使用perl / sed的例子,它应该很容易转换为任何语言:

s/<node idName="employee">(.*?)<\/node>/<node idName="supervisor">$1<\/node>/g

这可以很容易地修改为包含其他属性,它看起来像这样:

s/<node (.*?idName=)"employee"(.*?)>(.*?)<\/node>/<node $1"supervisor"$2>$3<\/node>/g

依此类推,如果XML包含大块内存,请注意它对内存的渴望。