2014-03-13 27 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