2012-01-22 38 views
0

使用Perl替换语句(s //)我想通过向某些项添加属性(如果缺失)来修改某些XML。这里有一个例子:如果缺少添加文本(Perl REGEXP)

... 
<car color="red" owner="john">...</car> 
<car color="green" age="3">...</car> 
... 

比方说,我想添加一个默认所有者给自主汽车。我试过以下没有成功:

s/(<car[^>]*)(?!owner="[^"]*")(.*>)|$1 owner="steve"$2/iUg 

任何帮助表示赞赏。

+1

的可能重复(http://stackoverflow.com/questions/1327720/in-perl-how-can-i-change-an-element-in-an-xml-file-without-changing-the-format) – Schwern

+1

避免使用正则表达式来解析/更改XML或HTML文档。这是一般性建议。 – snoofkin

回答

5

虽然您可能能够脱离正则表达式,但始终建议使用XML解析器。

的Perl/CPAN产品包括:

+1

你错过了一个链接到[最棒的SO回答]的机会(http://stackoverflow.com/a/1732454/301832)。 –

0

你可以试试这个

#!/usr/bin/perl -w 

$str = <<EOF; 
<car color="red" owner="john">.*#?§<car color="pink"> </car>.*#?§</car> 
<car color="green" age="3">.*#?§</car> 
<car owner="bill"></car> 
EOF 

$str =~ s/(<car(?![^>]+?owner))([^>]*?)>/$1$2 owner="steve">/g; 

print $str; 

问候


PS:最有可能是一个错字,但无论如何,在你的正则表达式竖线必须用斜杠来代替

+1

不需要空的while循环。 '/ g'已经确保它运行在'$ str'的​​所有元素上。循环只是让它运行两次,第二次循环不匹配任何东西,所以它返回0(匹配数)。这很容易变成无限循环,例如:'{foo} {foofoo} g'。 – Schwern

+0

@Schwern感谢您的评论。我记得:'m // g!= s /// g'最好的问候 – user1146332

1

我通常使用XML::XSH2进行XML操作。你的问题可以很容易地在它可以解决:?在Perl中,我怎么能更改一个XML文件中的元素不改变XML文件的格式]

for //car[not(@owner)] set @owner "steve" ;