【问题标题】:XML::Twig and save order of attributesXML::Twig 和属性的保存顺序
【发布时间】:2014-12-18 03:49:58
【问题描述】:

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

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

【问题讨论】:

    标签: xml perl xml-twig


    【解决方案1】:

    您确定顺序是BLOCK、STRING、OVERWRITE?这有点令人惊讶。

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

    我不确定您为什么需要这个:顺序对于任何(正确的)XML 处理器都无关紧要。如果您需要此版本控制,您可以查看 cvs 选项的 cvs 值,该选项旨在与面向行的工具配合使用。

    【讨论】:

      【解决方案2】:

      如果它使人们不必像我一样进行搜索以找出使其工作的语法...在阅读了 XML::Twig 的源代码后,我成功地实现了 mirod 的建议:

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

      Tie::IxHash 原来已经安装在我的盒子上,这很容易!

      【讨论】:

        猜你喜欢
        • 2022-01-15
        • 2013-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-06
        • 2013-08-14
        • 1970-01-01
        相关资源
        最近更新 更多