XML::Twig 更改已删除

标签 xml perl xml-twig

下面的程序给出了我无法解释的奇怪输出:

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

my $xml = 
q{<block>
    <foo>bar baz</foo>
</block>};

my $twig = XML::Twig->new(
        TwigHandlers => {foo => \&foo, block => \&block},
    );

print "after parse: " . $twig->parse($xml)->sprint;


sub foo {
    my ( $twig, $foo ) = @_;

    my $text = $foo->sprint("don't print outside element");
    my $newSummary = XML::Twig::Elt->parse( '<p><i>' . $text . '</i></p>' );
    $newSummary->paste( 'before', $foo);
    my $parent = $foo->parent;
    # $foo->delete;
    print "foo: " . $parent->sprint . "\n\n";
}

sub block {
    my ($twig, $block) = @_;
    print "block: " . $block->sprint . "\n\n";
}

它打印以下内容:

foo: <block><p><i>bar baz</i></p><foo>bar baz</foo></block>

block: <block><p><i>bar baz</i></p><foo>bar baz</foo></block>

after parse: <block><foo>bar baz</foo></block>

所以我正在修改 foo 处理程序内部的 Twig ,更改会一直存在,以便 block 处理程序看到它,但是当处理全部完成时,变化消失了。这里发生了什么?我怎样才能让我的改变在 Twig 的生命周期中持续下去?

最佳答案

它看起来像一个错误,或者至少是范围界定问题:解析完成时新元素似乎被垃圾收集。

避免这种情况的一种方法是在元素的创建中添加副本:

my $newSummary = XML::Twig::Elt->parse( '<p><i>' . $text . '</i></p>' )->copy;

关于XML::Twig 更改已删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13263193/

相关文章:

xml - 使用 XSLT 从带有嵌入链接的 XML 中提取纯文本

java - 错误: Error parsing XML: not well-formed (invalid token)?

regex - Perl 正则表达式不匹配

perl - XML::Twig - 管理具有相同标签的字段

perl - 使用 XML::Twig 处理嵌套元素

xml - 通过 JMS 发送 JSON 对象?

c# - SQL Server 2008 错误 - XML 分析 : document parsing required too much memory

perl - 有没有办法在 Perl 中托管进程(即实际有效的线程替换)?

perl - 如何从今天开始计算一周前的日期

xml - 如何在 Perl 中修改复杂的 XML 文档以向文本节点添加额外的标记?