XML :: Twig并保存属性的顺序

时间:2014-10-22 15:56:58

标签: xml perl xml-twig

我正在使用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">

如何以与原始文件相同的顺序保存属性,这样如果我将两个文件与修订系统进行比较,我只能看到我所做的更改?

2 个答案:

答案 0 :(得分:4)

您确定订单是BLOCKSTRINGOVERWRITE吗?这有点令人惊讶。

要回答您的问题:尝试安装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原来已经安装在我的盒子上,所以很简单!