2012-10-19 51 views
0

有一個XML-Twig示例顯示如何將id屬性與遞增值一起添加到指定元素。是否有簡單的方法將增加的id添加到所有元素。向所有元素添加遞增的id屬性

#!/bin/perl -w 

######################################################################### 
#                  # 
# This example adds an id to each player        # 
# It uses the set_id method, by default the id attribute will be 'id' # 
#                  # 
######################################################################### 

use strict; 
use XML::Twig; 

my $id="player001"; 

my $twig= new XML::Twig(twig_handlers => { player => \&player }); 
$twig->parsefile("nba.xml"); # process the twig 
$twig->flush; 
exit; 

    sub player 
    { my($twig, $player)= @_; 
     $player->set_id($id++); 
     $twig->flush; 
    } 
+0

*每個*元素,或每個''元素?你的代碼對於後者是正確的,儘管你可能不想覆蓋現有的ID。 – Schwern

回答

0

我打算假設你說「每個元素」是你的意思。有幾種方法可以通過twig_handlers來完成。有特殊處理器_all_。或者由於twig_handler鍵是XPath表達式,所以可以使用*

use strict; 
use warnings; 
use XML::Twig; 

my $id="player001"; 
sub add_id { 
    my($twig, $element)= @_; 

    # Only set if not already set 
    $element->set_id($id++) unless defined $element->id; 

    $twig->flush; 
} 

my $twig= new XML::Twig(
    twig_handlers  => { 
     # Either one will work. 
     # '*'  => \&add_id, 
     '_all_' => \&add_id, 
    }, 
    pretty_print  => 'indented', 
); 
$twig->parsefile(shift); # process the twig 
$twig->flush; 
+0

是的,謝謝我的意思是每個元素自動,因爲我不知道哪些元素被創建,因爲腳本正在轉換doxygen生成perl模塊的C++ api,並且可能有也可能不是公共靜態方法元素。 –