2015-11-05 56 views
0

我試着用下面的腳本無法通過包XML定位對象::嫩枝

#!/usr/local/bin/perl 
use strict; 
use warnings; 

use XML::Twig; 

my $twig = XML::Twig->new()->parsefile ('test.xml'); 

print "id;name;description;published\n"; 
foreach my $row ($twig->results->children('row')) {   
     print join(";", 
      $row->first_child_text('id'), 
      $row->first_child_text('name'), 
      $row->first_child_text('description'), 
      $row->first_child_text('published'), 
), 
      "\n"; 

} 

的XML文件轉換爲CSV但我發現了錯誤Can't locate object method "結果「通過一攬子」 XML ::嫩枝「在perl1.pl線10

這裏是我的XML

<results> 
    <row> 
    <id></id> 
    <name>...</name> 
    <description>...</description> 
    <published></published> 
</row> 
.... 
</result> 

回答

1

告訴你這個問題 - 這是這一行:

foreach my $row ($twig->results->children('row')) { 

沒有「結果」方法。你可能想:

foreach my $row ($twig->root->children('row')) { 

root方法訪問「文檔根」 - 在這種情況下是你的XML的「結果」元素。

您也可以使用get_xpath//row來查找文檔中任何位置的所有「行」元素。

作爲一個風格問題 - 避免重複儘可能多的希望 - 所以考慮到這一點,我建議:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use XML::Twig; 

my @cols = qw (id name description published); 

my $twig = XML::Twig->parsefile('test.xml'); 

print join(";", @cols), "\n"; #header row 
foreach my $row ($twig->get_xpath('//row')) { 
    print join(";", map { $row->first_child_text($_) } @cols), "\n"; 
} 
+0

謝謝你的提示 – user5507230

+0

現在我得到這個錯誤不能用string (「XML :: Twig」)作爲HASH ref,而在/usr/local/lib/x86_64-linux-gnu/perl/5.20.2/XML/Parser.pm第224行使用「strict refs」。 at perl1 .pl第6行。 – user5507230

+0

OK。無法回答爲什麼,沒有看到一些代碼。但是......你有在代碼中使用XML :: Twig嗎?因爲這通常表示沒有加載模塊。 – Sobrique