2014-04-22 29 views
0

我试图处理项目(在这种情况下,图像)的XML列表并迭代每个。我不是很了解Perl或哈希,但是我找到了一些解释和例子(这里有很多),并写了一些似乎可行的东西。 XML是一个元素列表,每个元素都包含一个唯一的'id'属性。解析和遍历每个条目具有多个属性的XML结构

我正在使用来自XML :: Simple的XMLin来解析XML。

当列表包含多个元素时,它通过'id'进行迭代。但是,似乎只有一个时,它会变得困惑,并将该元素的每个属性视为自己的值,这会导致运行时错误。

而“严格裁判”使用

我猜测,问题是,哈希键不说“不能用字符串(“0”)作为HASH裁判ID'是唯一的密钥,至少当只有一个条目时。所以我添加了代码来转储密钥。我还添加了一行以打印$imageforeach循环中的内容。在休息的情况下,行print "In loop; image ID=$image\n";显示In loop; image ID=Serial由于Serial是一个属性在id相同的水平,我猜这是问题(不正确使用id作为关键)。

这里是我的代码:

​​

下面是打破它一个示例XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<rsp stat="ok"> 
    <method>images.get</method> 
    <Images> 
    <Image id="123" Key="xyz" Type="Album" Caption="Room 5083" FileName="MVI_2838.AVI" Format="MP4" Height="480" Keywords="China; Suite" LastUpdated="2014-04-19 11:49:45" Position="1" Serial="0" Size="116033" Width="640" Date="2014-04-19 11:46:24" Hidden="0" MD5Sum="6151e20053eeda87c688f8becae0d402" Watermark="0"> 
     <Album id="345" Key="zzy" /> 
    </Image> 
    </Images> 
</rsp> 

这里倾倒全$ album_data结果:

$VAR1 = { 
     'method' => 'images.get', 
     'Images' => { 
        'Image' => { 
          'Serial' => '0', 
          'Format' => 'MP4', 
          'Keywords' => 'China; Suite', 
          'Type' => 'Album', 
          'Size' => '116033', 
          'MD5Sum' => '6151e20053eeda87c688f8becae0d402', 
          'id' => '123', 
          'Key' => 'xyz', 
          'LastUpdated' => '2014-04-19 11:49:45', 
          'Album' => { 
             'id' => '345', 
             'Key' => 'zzy' 
             }, 
          'Position' => '1', 
          'Height' => '480', 
          'Date' => '2014-04-19 11:46:24', 
          'Caption' => 'Room 5083', 
          'FileName' => 'MVI_2838.AVI', 
          'Hidden' => '0', 
          'Width' => '640', 
          'Watermark' => '0', 
          } 
       }, 
     'stat' => 'ok' 
    }; 

这里的转储密钥的结果%{$ album_data - > {Images} - > {Image}}构造:

$VAR1 = 'Serial'; 
$VAR2 = 'Format'; 
$VAR3 = 'Keywords'; 
$VAR5 = 'Type'; 
$VAR6 = 'Size'; 
$VAR7 = 'MD5Sum'; 
$VAR9 = 'id'; 
$VAR10 = 'Key'; 
$VAR11 = 'LastUpdated'; 
$VAR12 = 'Album'; 
$VAR14 = 'Position'; 
$VAR15 = 'Height'; 
$VAR16 = 'Date'; 
$VAR17 = 'Caption'; 
$VAR19 = 'FileName'; 
$VAR20 = 'Hidden'; 
$VAR23 = 'Width'; 
$VAR24 = 'Watermark'; 
$VAR27 = 'Duration'; 

回答

1

根据XML::Simple #Status of this Module

使用本模块中新代码是不鼓励。其他模块可提供更直接和一致的接口。特别推荐XML::LibXML

该模块的主要问题是大量的选项以及这些选项交互的任意方式 - 通常会产生意想不到的结果。

欢迎使用修补程序和文档修补程序的修补程序,但不太可能添加新功能。

XML::Simple是一个有用的模块,可以快速解析xml,如果您熟悉perl复杂的数据结构。但是,无论何时xml过于复杂,该模块都会失去实用性,因为它是根据大量配置变量解析某些结构的任意方法。

我在极少数情况下仍然使用XML::Simple,但我建议您查看XML::Twig或上述XML::LibXML以避免这样的问题。

0

我很欣赏米勒的警告说,XML::Simple气馁,他的警告,这是很难用,由于其中的方式,是很难界定和管理互动这么多的选择。在研究他建议的替代模块时,我偶然发现了一些我在使用XML::Simple之前应该知道的信息。尤其是,当我的脚本在多个图像位于XML中时工作,但在仅有一点指出如果使用的是XML::Simple时失败,将ForceArray选项设置为始终始终的元素通常是至关重要的应该是在一个数组中,即使一个特定的XML文件只包含一个。否则,元素有时会是一个数组,有时是一个标量,导致我看到的确切的运行时错误。

所以,在我的情况,设置forcearray => [ 'Image' ]使代码工作(通过强制所有<image>元素融入到一个数组,即使只有一个),在不是自己不那么直接的努力弄清楚如何使用不同的XML解析模块(尽管我毫不怀疑,努力这样做将会为未来节省时间)。

相关问题