2014-03-13 38 views
-2

我有這樣如何找到XML標籤並使用perl生成序列號?

<ce:refers type="book">DHO</ce:refers> 
<ce:refers type="journal" num="ref0005">RTO</ce:refers> 
<ce:refers type="book">DHO</ce:refers> 
<ce:refers type="journal">RHO</ce:refers> 
<ce:refers type="book">DHO</ce:refers> 
<ce:refers type="book" num="ref0010">EHO</ce:refers> 

現在我想找到那些沒有NUM屬性,併產生NUM值,NUM值由5遞增和需要改變NUM不影響退出NUM和標籤的XML數據沒有不允許有相同的num值。

我試過用正則表達式,但我做不到。我希望輸出這樣

<ce:refers type="book" num="ref0015">DHO</ce:refers> 
<ce:refers type="journal" num="ref0005">RTO</ce:refers> 
<ce:refers type="book" num="ref0025">DHO</ce:refers> 
<ce:refers type="journal" num="ref0030">RHO</ce:refers> 
<ce:refers type="book" num="ref0035">DHO</ce:refers> 
<ce:refers type="book" num="ref0010">EHO</ce:refers> 
+0

你可以嘗試使用'XML :: Smart'。 [Here](http://search.cpan.org/~tmharish/XML-Smart-1.79/lib/XML/Smart/Tutorial.pod)你有一個教程。然後嘗試自己解決,如果你不能,請回到SO,發佈你已經嘗試過的,然後等待幫助。 –

回答

0

使用xsh,包裝周圍XML::LibXML

open data.xml ; 
my $s  := sort :k @num //ce:refers/@num ; 
my $last = { $s->[-1] } ; 
my $maxnum = xsh:match($last, '(\d+)') ; 
for //ce:refers[not(count(@num))] { 
    $maxnum += 5 ; 
    set @num xsh:sprintf('ref%04d', $maxnum) ; 
} 
save :b ; 

注意,輸出到樣品略有不同(ref0005缺少你的樣品中)。

+0

有可能使用正則表達式嗎? – user3415386

+0

@ user3415386:這就是'xsh:match'的作用。 – choroba