首先为这个noob问题道歉,我是XML解析的新手。我尝试使用xml::twig
解析一些基本的XML。我已经设法使用下面的perl脚本提取了一些元素,但我遇到了一些困难。
我已设法使用下面指定的代码提取itemId
和title
。但是,由于某种原因,脚本不会提取convertedCurrentPrice
。我希望提取价格 - 在下面的XML代码段中为74
。我怀疑这不起作用,因为XML以convertedCurrentPrice
和itemID
的格式略有不同的格式显示title
的信息。
如何更改我的脚本以便像其他值一样提取convertedCurrentPrice
?
以下是XML文件(testxml.xml
)的示例。
<itemId>222bb5786411</itemId><title>Radiohead In Rainbows Box Set Vinyl Deluxe Limited Edition</title><sellingStatus><currentPrice currencyId="GBP">74.0</currentPrice><convertedCurrentPrice currencyId="GBP">74.0</convertedCurrentPrice>
这是我的perl脚本;
#!/bin/perl -w
use strict;
use XML::Twig;
my $twig = XML::Twig->new(
twig_handlers => {item => \&acct}
);
$twig->parsefile("testxml.xml");
sub acct {
my ($t, $elt) = @_;
for my $tag (qw(itemId title convertedCurrentPrice)) {
print $elt->field($tag), "\n";
}
print "\n";
print "\n";
}
__END__
答案 0 :(得分:0)
首先 - 为了正确回答这个问题,我们确实需要一些有效的XML。你的不是。
我认为问题的根源在于您无法从convertedCurrentPrice
中提取item
,因为它嵌套在sellingStatus
下面
虽然很难确定,但这就是为什么我们确实需要有效的XML。我从最好的猜测中重建了你的,这就是我发现的。
通过漂亮的打印机运行XML:
XML::Twig -> new ( pretty_print => 'indented_a') -> parsefile('testxml.xml') ->print;
您可能会发现类似的内容:
<xml>
<item>
<itemId>222bb5786411</itemId>
<title>Radiohead In Rainbows Box Set Vinyl Deluxe Limited Edition</title>
<sellingStatus>
<currentPrice currencyId="GBP">74.0</currentPrice>
<convertedCurrentPrice currencyId="GBP">74.0</convertedCurrentPrice>
</sellingStatus>
</item>
</xml>
我还建议 - 这不是一个小枝操作员的工作,除非有其他事情发生,所以我会更像这样解决:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig -> new() -> parse ( \*DATA );
foreach my $item ( $twig -> findnodes ( '//item' ) ) {
print join ",",( map { $item -> get_xpath($_,0)->text } qw ( itemId title sellingStatus/convertedCurrentPrice )), "\n";
}
$twig -> set_pretty_print('indented_a');
$twig -> print;
__DATA__
<xml><item><itemId>222bb5786411</itemId>
<title>Radiohead In Rainbows Box Set Vinyl Deluxe Limited Edition</title>
<sellingStatus><currentPrice currencyId="GBP">74.0</currentPrice>
<convertedCurrentPrice currencyId="GBP">74.0</convertedCurrentPrice>
</sellingStatus>
</item></xml>
但你可以这样做:
$item -> first_child('sellingStatus') -> field('convertedCurrentPrice')
代替通过xpath
表达式执行此操作。