1

我确定我没有正确使用它,我的代码:

#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;

XML::Twig->new( pretty_print  => 'indented',
                twig_handlers => { '//Item[@PartNumber]' => \&_pitem
                                  },
)->parsefile_inplace( 'order2.xml', '.bak' );

sub _pitem {
    $_->set_text(...) if (....);
}

如果 XML 中没有与该 XPath 表达式匹配的元素,则 XML 似乎是空的……它会截断文件。我想要的行为是:如果没有匹配的元素,则根本避免编辑 XML。

4

3 回答 3

4

如果您使用parsefile_inplace,则无论如何该文件都将被覆盖。

您需要flush该文件,或在必要时自行管理新文件的创建。

您可以使用代码 fromXML::Twig作为基础。

于 2013-03-09T11:00:51.620 回答
1

您没有编写任何输出任何 XML 的内容。

你应该twig_roots这样使用

my $twig = XML::Twig->new(
    twig_roots               => { '//Item[@PartNumber]' => \&_pitem },
    twig_print_outside_roots => 1,
    pretty_print             => 'indented',
);

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

sub _pitem {
    $_->set_text(...) if (....);
    $_->print;
}
于 2013-03-09T11:04:54.187 回答
0

在 _pitem 的末尾,您必须

$_->flush;
于 2013-03-09T10:01:06.857 回答