2016-04-05 3 views
1

Во первых извинения за этот вопрос noob, я новичок в разборе XML. Я пытаюсь проанализировать некоторые основные XML, используя xml::twig. Мне удалось извлечь некоторые элементы, используя приведенный ниже скрипт perl, но у меня возникают некоторые трудности с другими.Анализ XML с переменным форматом

Мне удалось извлечь itemId и title, используя код, указанный ниже. Однако по какой-то причине сценарий не извлекает convertedCurrentPrice. Я хотел бы, чтобы цена была извлечена - это будет 74 в нижеприведенном фрагменте XML. Я подозреваю, что это не работает, потому что 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

Прежде всего, для правильного ответа на этот вопрос нам действительно нужен правильный XML. Твой нет.

Я думаю, что корень вашей проблемы в том, что вы не можете на самом деле извлечь из convertedCurrentPriceitem, потому что он вложен под 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 выражения.

 Смежные вопросы

  • Нет связанных вопросов^_^