2011-09-15 34 views
0

我有一个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>

如何更换“员工”与“导师”,并与“雇员”取代“经理”只在属性?

感谢, 摹

+4

您应该为此任务使用XML解析器,而不是正则表达式 – arnaud576875

+0

@Gzer:请阅读http://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-why-it- is-hard-to-parse-xml-and-html-with-a-rege并重新考虑你的方法。 –

回答

0

一个正则表达式是无法处理的类的语言的XML是一部分。不过当然还有一个哈克的方式做到这一点:

  • 你可以只匹配idName="something" - 包括等号和报价 - 与idName="somethingelse"

但是代替它,这当然的只有在上面显示的确切字符串确定不会在任何XML元素主体中显示为文本时才起作用。如果是这种情况,那么确实没有办法绕过正确的XML解析器。

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

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包含大块,那么请注意它渴望记忆。

+0

让我清楚,我并不是建议这是最好的方式,这部分是对fgysin答案的回应。我不知道是否将它标记为正则表达式,因为您没有考虑使用解析器,因为解析器对您来说太复杂了,或者因为您因为其他原因特别需要正则表达式。无论哪种方式,至少这是有效的;) – sillyMunky