XML::Twig 并保存属性顺序

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

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

最佳答案

您确定顺序是BLOCKSTRINGOVERWRITE?这会有点令人惊讶。

要回答您的问题:尝试安装 Tie::IxHash 并在创建 Twig 时使用 keep_atts_order 选项。这应该可以做到。

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

关于XML::Twig 并保存属性顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26511802/

相关文章:

python - 扩展 pyyaml 以像 xml ElementTree 一样查找和替换

perl -\& 和 $expr->() 的用法是什么

ruby - Perl 类似于 ruby​​ 中的匿名子程序

xml - LWP::UserAgent 用于 XML POST 到 HTTPS 服务器不工作

java - Eclipse - 在 Java 透视图中禁用 XML 文件的编译

c# - 在 SVG 文件中获取 XML 元素时出现问题

Perl XML::Twig 没有子项的复制

java - 带有 @XmlTransient 的 JAXB 抽象类

perl - 使用 Perl 更新基于其他的 xml 属性值