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">

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

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

要回答您的问题:请尝试安装Tie::IxHash,并在创建分支时使用keep_atts_order选项。这样就可以了。

不过,我不确定您为什么需要这样做:对于任何(适当的)XML处理器来说,顺序都不重要。如果您需要这一点来进行版本控制,您可以查看pretty_print选项的cvs值,该选项旨在与面向行的工具配合使用。

如果它省去了人们像我一样搜索语法以使其工作。。。在阅读了XML::Twig的来源后,我成功地用实现了mirod的建议

use Tie::IxHash;
$twig->set_keep_atts_order(1);

领带:原来IxHash已经安装在我的盒子上了,所以这很容易!

最新更新