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

smi*_*ith 5 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;
Run Code Online (Sandbox Code Playgroud)

问题是这段代码没有在编辑过的文件中以相同的顺序保存 xml 属性。

例如来自输入 xml 的这一行:

<DEVICE OVERWRITE="TRUE" STRING="TRUE" BLOCK="FALSE">
Run Code Online (Sandbox Code Playgroud)

被输出 xml 中的这一行替换:

<DEVICE  BLOCK="FALSE" STRING="TRUE"  OVERWRITE="TRUE">
Run Code Online (Sandbox Code Playgroud)

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

mir*_*rod 6

你确定顺序是BLOCK, STRING, OVERWRITE?这会有点令人惊讶。

回答您的问题:尝试在创建树枝时安装Tie::IxHash和使用该keep_atts_order选项。这应该这样做。

我不知道你为什么需要这个:对于任何(适当的)XML 处理器来说,顺序应该无关紧要。如果您需要此进行版本控制,您可以查看cvspretty_print选项的值,该选项旨在与面向行的工具配合使用。