如何使用 Perl 的 XML::Twig 就地修改 XML 文件?

How can I modify an XML file in place using Perl's XML::Twig?

我正在使用 Perl 和 XML::Twig。我在 XML 文件中做了一些更改(更改标签的值)。但是我不能把它写在同一个 XML 文件中。如果我使用 parsefile_inplace(),整个 XML 文件就会变空。请在下面找到代码。

use strict;
use warnings;
use XML::Twig;

my $twig= XML::Twig->new(
        pretty_print => 'indented',
        twig_handlers => {
            jdk => sub{ 
            $_->set_text( 'JDK 1.8.0_40' )
            },
            },
        );
$twig->parsefile_inplace( 'nightly.xml', 'bak.*' );
$twig->flush;

XML 文件的一部分:

<jdk>JDK 1.7.0_40</jdk>

如果我使用 flush 命令,它会在 cmd 上提供所需的输出。

如果我使用 parsefile_inplace 命令,它会清空 nightly.xml

如果我只使用 parsefile 原始文件将保持原样,而不会更改我想要更改的值。

我的要求是编辑值并将其保存在同一个文件中

the documentation for parsefile_inplace 是这样说的:

parsefile_inplace ( $file, $optional_extension)

Parse and update a file "in place". It does this by creating a temp file, selecting it as the default for print() statements (and methods), then parsing the input file. If the parsing is successful, then the temp file is moved to replace the input file.

If an extension is given then the original file is backed-up (the rules for the extension are the same as the rule for the -i option in perl). (emphasis mine)

我在你的代码中没有看到任何打印语句。

这是一种方法,只需对您的代码稍作改动即可:

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Twig;

my $twig= XML::Twig->new(
    pretty_print => 'indented',
    twig_roots => {
        jdk => sub{
            my ($t, $jdk) = @_;
            $jdk->set_text( 'JDK 1.8.0_40' );
            $jdk->print;
            $jdk->purge;
            return;
        },
    },
    twig_print_outside_roots => 1,
);

$twig->parsefile_inplace( 'nightly.xml', '.bak' );
$twig->flush;