我正在使用XML::Twig
编辑一些XML文件,代码如下:
my $twig = XML::Twig->new(
pretty_print => 'indented',
twig_handlers => {
Vendor => sub {
$_->set_att( 'ID' => $_->{'att'}->{'att1'} );
$_->set_att( 'ID' => $_->{'att'}->{'att2'} );
$_->set_att( 'ID' => $_->{'att'}->{'att3'} );
$_->set_att( 'ID' => $_->{'att'}->{'att4'} );
},
},
);
$twig->parsefile('myfile');
$twig->flush;
问题是此代码不会在编辑的文件中以相同的顺序保存xml属性。
例如来自输入xml的这一行:
<DEVICE OVERWRITE="TRUE" STRING="TRUE" BLOCK="FALSE">
输出xml中的替换为
:
<DEVICE BLOCK="FALSE" STRING="TRUE" OVERWRITE="TRUE">
如何以与原始文件相同的顺序保存属性,这样如果我将两个文件与修订系统进行比较,我只能看到我所做的更改?
答案 0 :(得分:4)
您确定订单是BLOCK
,STRING
,OVERWRITE
吗?这有点令人惊讶。
要回答您的问题:尝试安装Tie::IxHash
并在创建树枝时使用keep_atts-order
选项。这应该做到。
我不确定为什么你会需要这个:顺序对任何(正确的)XML处理器都不重要。如果您需要这个用于版本控制,您可以查看cvs
选项的pretty_print
值,该选项旨在与面向行的工具配合使用。
答案 1 :(得分:1)
如果它省去了人们像我一样去寻找语法使其工作的麻烦……在阅读XML :: Twig的源代码之后,我成功实现了mirod的建议:
use Tie::IxHash;
$twig->set_keep_atts_order(1);
Tie :: IxHash原来已经安装在我的盒子上,所以很简单!