【问题标题】:perl xml::libxml findvalue matchperl xml::libxml findvalue 匹配
【发布时间】:2014-05-17 03:55:46
【问题描述】:

我是 perl 和 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>

<book_reviews>
    <results>
        <review id="1">
            <title>First Book</title>
            <reviewed_by>Anne</reviewed_by>
            <rating>5</rating>
        </review>
        <review id="2">
            <title>First Book</title>
            <reviewed_by>Bob</reviewed_by>
            <rating>3</rating>
        </review>
        <review id="3">
            <title>Second Book</title>
            <reviewed_by>Charlie</reviewed_by>
            <rating>4</rating>
        </review>
        <review id="3">
            <title>Second Book</title>
            <reviewed_by>Anne</reviewed_by>
            <rating>4</rating>
        </review>
    </results>
</book_reviews>

这是我尝试过的一些代码

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

print "Couldn't retrieve critic details\n" 
    unless my $critic_details   = $parser->parse_file($critics_file);   

#extract the reviewers details and write to file
for my $critics ($critic_details->findnodes('/book_reviewers/results/reviewer')) {
    #get each of the critic's details
    my $name = $critics->findvalue('name');
    my $profession = $critics->findvalue('profession');
        for my $reviews($book_reviews->findnodes('book_reviews/results/review')){
            my $reviewed_by = $reviews->findvalue('reviewed_by');
                if ($reviewed_by eq $name ){
                    my $book =  $reviews->findvalue('title');
                    my $rating = $reviews->findvalue('rating');
                }
        }
}

我想做的是:

  1. 遍历每个 book_reviewer 并获取名称。专业。

  2. 对于每个通过评论的 book_reviewer 并获取该 book_reviewer 的所有 book_reviews 并提取有关评论的详细信息。

它将显示在 html 表格中,但我可以这样做,没问题。

目前它与 $reviewed_by 和 $critic 的值不匹配 - 但如果我对 $critic 值进行硬编码,即 if ($reviewed_by eq 'Anne'),它将匹配

我也试过了

$byline->isSameNode($name );
$byline->isEqual($name );

还有

$query = "//review[bline/text() = $name ";

感谢任何帮助 - (我无法安装任何其他模块 - 只能使用默认模块) 干杯

【问题讨论】:

  • 您的代码有效 - 我试过了 - 在修复了 结束标签之后。你在用 $book 和 $rating 做什么,也许这才是真正的问题。

标签: xml perl libxml2 string-matching


【解决方案1】:

我建议你在代码中打开警告和严格。

use warnings;
use strict;

如果你这样做,你会注意到变量 $critic 没有被定义。

另一个对各种 perl 问题非常有用的技巧是包含 Data::Dumper。

use Data::Dumper

然后你可以通过打印诸如

之类的东西来看看你有什么
print Dumper($critics);

最后,在稍微玩了一下你的代码之后,我认为你的主要问题是你在调用中使用的地址来查找节点。

您使用'/book_reviewer/results/reviewer' 代替'/book_reviewers/results/reviewer' 的第一个呼叫和您使用'/result_set/results/review' 代替'/book_reviews/results/review' 的第二个呼叫。 我将它们插入,添加了一些打印语句以查看正在发生的事情,并且看起来它有效。

for my $critics ($critic_details->findnodes('/book_reviewers/results/reviewer')) {
    #get each of the critic's details
    my $name = $critics->findvalue('name');
    print "Got Name: $name\n";
    my $profession = $critics->findvalue('profession');
    print "Got Profession: $profession\n";
    for my $reviews ($book_reviews->findnodes('/book_reviews/results/review')){
        print Dumper($reviews);
        my $reviewed_by = $reviews->findvalue('reviewed_by');
            print "Got reviewed_by: $reviewed_by\n";
            print "Compare $reviewed_by with $name\n";
            if ($reviewed_by eq $name ){
                print "Bingo!\n";
                my $book =  $reviews->findvalue('title');
                my $rating = $reviews->findvalue('rating');
            }
    }
}

【讨论】:

  • 抱歉 - 为示例更改了一些代码 - 现在将编辑(我正在使用严格)
  • 尝试将'/book_reviewer/results/reviewer' 更改为'/book_reviewers/results/reviewer'。结果集的相同交易
  • 对不起,这是我的例子中的一个错字——我没有使用真正的 xml,因为它的名称令人困惑(来自免费提供的 API)——我认为我已经正确地校对了,但显然没有.现在将尝试您的解决方案 - 谢谢
  • 您通过提供不正确的信息使您的问题无法回答。
  • 您的代码只设置了两个变量,然后立即退出范围并被删除。你期望发生什么?
猜你喜欢
  • 2023-03-24
  • 2014-10-14
  • 2015-10-25
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多