为什么 XML::Twig 将提取的字符串输出两次?

发布于 2024-08-16 17:45:50 字数 651 浏览 9 评论 0原文

为什么我的字符串在输出中出现两次?

#!/usr/bin/perl
use warnings;
use strict;

use XML::Twig;


my $string = '<cd_catalogue><title>Hello, World!</title></cd_catalogue>';

my $t= XML::Twig->new(  twig_handlers   => { cd_catalogue => \&cd_catalogue, },
            pretty_print => 'indented', 
);

$t->parse( $string );


sub cd_catalogue {
    my( $t, $cd_catalogue ) = @_;
    $cd_catalogue->flush;
}


# Output:
#<cd_catalogue>
#  <title>Hello, World!</title>
#</cd_catalogue>
#<cd_catalogue>
#  <title>Hello, World!</title>
#</cd_catalogue>

Why do I get my string two times in the output?

#!/usr/bin/perl
use warnings;
use strict;

use XML::Twig;


my $string = '<cd_catalogue><title>Hello, World!</title></cd_catalogue>';

my $t= XML::Twig->new(  twig_handlers   => { cd_catalogue => \&cd_catalogue, },
            pretty_print => 'indented', 
);

$t->parse( $string );


sub cd_catalogue {
    my( $t, $cd_catalogue ) = @_;
    $cd_catalogue->flush;
}


# Output:
#<cd_catalogue>
#  <title>Hello, World!</title>
#</cd_catalogue>
#<cd_catalogue>
#  <title>Hello, World!</title>
#</cd_catalogue>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不甘平庸 2024-08-23 17:45:50

将您的子程序更改为使用 printpurge 而不是 flush 可以解决问题:

sub cd_catalogue {
    my( $t, $cd_catalogue ) = @_;
    $cd_catalogue->print;
    $cd_catalogue->purge;
}

flush 由于以下原因而变得混乱您的示例很简单,因为 cd_catalogue 是根节点。如果您将数据更改为如下所示:

my $string = '
    <cds>
        <cd_catalogue><title>Hello, World!</title></cd_catalogue>
    </cds>';

或者如果您更改了 twig_handler 以查找 title

twig_handlers    => { title => \&cd_catalogue }

那么您会发现 $cd_catalogue->flush 现在按预期工作与您的$string

/I3az/

Changing your sub to use print and purge instead of flush gets around problem:

sub cd_catalogue {
    my( $t, $cd_catalogue ) = @_;
    $cd_catalogue->print;
    $cd_catalogue->purge;
}

The flush is getting confused because of the simplicity of your example because cd_catalogue is root node. If you change your data to something like this:

my $string = '
    <cds>
        <cd_catalogue><title>Hello, World!</title></cd_catalogue>
    </cds>';

or if you changed your twig_handler to look for title:

twig_handlers    => { title => \&cd_catalogue }

then you will find that $cd_catalogue->flush now works as expected with your $string.

/I3az/

聽兲甴掵 2024-08-23 17:45:50

您的程序错误地使用了 XML::Twig。 根据文档,您应该“始终冲洗树枝,而不是一个元素。”

cd_catalogue 更改为以

sub cd_catalogue {
    my( $t, $cd_catalogue ) = @_;
    $t->flush;
}

获得预期的行为。

Your program uses XML::Twig incorrectly. According to the documentation, you should "always flush the twig, not an element."

Change cd_catalogue to

sub cd_catalogue {
    my( $t, $cd_catalogue ) = @_;
    $t->flush;
}

to get the expected behavior.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文