Perl XML :: LibXML替换文本 [英] Perl XML::LibXML replace text

查看:147
本文介绍了Perl XML :: LibXML替换文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

简单的xml文件cr.xml

<book_reviewers>
    <results>
        <reviewer>
            <name>Anne</name>
            <profession>Catfish wrangler</profession>
        </reviewer>
        <reviewer>
            <name>Bob</name>
            <profession>Beer taster</profession>
        </reviewer>
        <reviewer>
            <name>Charlie</name>
            <profession>Gardener</profession>
        </reviewer>
    </results>
</book_reviewers>

我想遍历每位审阅者,并用一个新的名字代替

I want to loop through each reviewer and replace the name with a new one

我不尝试同时使用这两种方法,但是以其他两种形式访问其他帖子应该可以,但是我不断收到错误消息:

I am not trying to use both these methods, but going by other posts in the form both of these should work but I keep getting errors:

Can't locate object method "setData"

Can't locate object method "removeChildNodes

Can't locate object method "appendText"

#!/usr/bin/perl -w

use strict;
use XML::LibXML;

my $critics_file = "cr.xml";
my $parser = new XML::LibXML;   


print "Couldn't retrieve review details\n" 
    unless my $book_reviews  = $parser->parse_file($reviews_file);


foreach my $critics ($critic_details->findnodes('/book_reviewers/results/reviewer')) {

    my $value = $critics->findvalue('name');    #returns the correct name
    $value->removeChildNodes();
    $value->appendText('new_name');

     ##ONLY EITHER THE ABOVE METHOD OR THE ONE BELOW - NOT BOTH

    my $node  = $critics->findnodes('.//name.text()');#returns the correct name
    $node->setData('new_name');


}

谁能看到我要去哪里错了?

Can anyone see where I am going wrong?

欢呼

推荐答案

尝试进入TIMTOWTDI,这是另一个具有更紧凑代码的示例:

Trying to get you into TIMTOWTDI, here is another example with more compact code:

您可以直接找到所有<name>…</name>元素,并可以使用默认"变量$_立即对其进行迭代.

You can find all the <name>…</name> elements directly, and you can iterate over them immediately, using the 'default' variable $_.

use strict;
use warnings;

use utf8;

use XML::LibXML;

my $filename = "cr.xml";

my $parser = XML::LibXML->new();
my $critic_details = $parser->parse_file("$filename") or die;

my $new_name = "new_name";

# find ALL the <book_reviewers><results><reviewers><name> nodes
foreach ($critic_details
  ->findnodes("book_reviewers/results/reviewer/name")
) {
  $_->removeChildNodes();
  $_->appendText($new_name);
}

use XML::LibXML::PrettyPrint;
my $pretty = XML::LibXML::PrettyPrint->new(
  indent_string =>' ' x4,
  element       => {
    compact       => [qw| name profession |],
    }
  );
$pretty->pretty_print($critic_details);

print $critic_details->toString;

__END__

享受!

这篇关于Perl XML :: LibXML替换文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆