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



所以我试图用以下格式解析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 $filen";
 }
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";
}

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

您只需要在散列键周围加上引号。所以你应该说:$values->{'scan-results'},而不是:$values->{scan-results}

参见:从XML::Simple到XML::LibXML

编辑

代码中有print Dumper($values);行。它产生的输出将回答您的问题(如果哈希键包含'-'等非单词字符,则必须用引号括起来)。如果您无法解释Data:: dump的输出,那么您需要阅读Perl参考教程。

我还注意到代码的其他部分包含随机错误,这些错误可能是剪切和粘贴您不理解的东西的结果。例如,将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";
}

最新更新