【发布时间】: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');
}
}
}
我想做的是:
遍历每个 book_reviewer 并获取名称。专业。
对于每个通过评论的 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