2012-01-22 44 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" ;