2016-04-05 13 views
1

まず、このnoobに関する質問にお詫び申し上げます。私はXML解析の初心者です。私はxml::twigを使っていくつかの基本的なXMLを解析しようとしています。私は下のperlスクリプトを使っていくつかの要素を抽出しましたが、他の人にはいくつかの問題があります。さまざまな形式のXMLを解析する

私はitemIdtitleを下記のコードを使用して抽出することができました。ただし、何らかの理由でスクリプトがconvertedCurrentPriceを抽出しません。私は価格が抽出されることを望みます - それは以下のXMLスニペットになります。 XMLがitemIDtitleとは若干異なる形式でconvertedCurrentPriceの情報を表示するため、これは機能していないと思われます。

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

これを正しく答えるには、実際には有効なXMLが必要です。あなたはそうではありません。

私はあなたの問題の根本は、それがsellingStatus

それは我々が本当に有効なXMLが必要な理由である、しかし確かに難しいの下にネストされていますので、あなたが実際にitemからconvertedCurrentPriceを抽出することはできませんということだと思います。私は最高の推測からあなたのものを再構築しました。それが私が目にしたものです。

プリティプリンタを通して、あなたの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という表現を使用します。