如何使用perl解析程序处理带连字符的xml文件

时间:2013-05-29 22:26:13

标签: xml perl

所以我试图用以下格式解析xml文件......

<message>
<cmd id="result_data">
    <result-file-header>
      <path>PFMD</path>
      <duration>10.56</duration>
      <spectra-count>4</spectra-count>
     </result-file-header>
     <scan-results count="10">
        <scan-result>
               <spectrum-index>4</spectrum-index>
               <scan-index>7</scan-index>
               <time-stamp>13</time-stamp>
               <tic>130e5</tic>
               <start-mass>135</start-mass>
               <stop-mass>500</stop-mass>
               <spectrum count="3">131,45;181,54;240,2</spectrum>
        </scan-result>
        <scan-result>
               <spectrum-index>2</spectrum-index>
               <scan-index>5</scan-index>
               <time-stamp>15</time-stamp>
               <tic>100e5</tic>
               <start-mass>100</start-mass>
               <stop-mass>500</stop-mass>
               <spectrum count="3">131,5;181,6;240,7</spectrum>
         </scan-result>
     </scan-results>
    </cmd>
</message>

...使用Perl将我想要的结果输出到文本文件中。

但是,我在处理被连字符的xml名称时遇到了困难。

这是我正在使用的Perl代码

 #!/usr/bin/perl-w
 #example to write to text
 my $file = "gapiparseddataexample1.txt";
 unless(open FILE, '>'.$file) {
 die "\nUnable to create $file\n";
 }

use warnings;
use strict;
 use XML::Simple;
 use Data::Dumper;


 my $values= XMLin('samplegapi.xml',KeyAttr=>"scan-result", ForceArray=>'scan-result');       

print Dumper($values);


for my $data(@{$values->{scanresult}}) {
    print FILE "Total Ion Count",":","\n";
    print FILE $data->{tic},"\n";

}

非常感谢任何有关如何解决连字符(即用下划线替换它们)的建议。

1 个答案:

答案 0 :(得分:6)

您只需在哈希键周围加上引号即可。因此,您应该说:$values->{scan-results}而不是:$values->{'scan-results'}

另请参阅:Stepping up from XML::Simple to XML::LibXML

修改

您的代码中有print Dumper($values);行。它产生的输出将回答你的问题(结合哈希键必须引用的知识,如果它们包含像' - '这样的非单词字符)。如果您无法解释Data :: Dumper的输出,那么您需要阅读Perl references tutorial

我还注意到代码的其他部分包含随机错误,这些错误可能是剪切和粘贴您不理解的内容的结果。例如,将ForceArray选项设置为'scan-result'只是无稽之谈。您需要将其设置为1或对元素名称数组的引用。同样,将KeyAttr设置为"scan-result"毫无意义。这些选项都有记录。

以下是一些适用于我的代码:

my $values= XMLin('samplegapi.xml', ForceArray => [ 'scan-result' ]);

my $results = $values->{'cmd'}->{'scan-results'}->{'scan-result'};

for my $data (@$results) {
    print FILE "Total Ion Count",":","\n";
    print FILE $data->{tic},"\n";
}