解析具有不同格式的XML

时间:2016-04-05 17:21:00

标签: xml xml-parsing xml-twig

首先为这个noob问题道歉,我是XML解析的新手。我尝试使用xml::twig解析一些基本的XML。我已经设法使用下面的perl脚本提取了一些元素,但我遇到了一些困难。

我已设法使用下面指定的代码提取itemIdtitle。但是,由于某种原因,脚本不会提取convertedCurrentPrice。我希望提取价格 - 在下面的XML代码段中为74。我怀疑这不起作用,因为XML以convertedCurrentPriceitemID的格式略有不同的格式显示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__

1 个答案:

答案 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表达式执行此操作。