1

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

}

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

4

1 回答 1

6

您只需要在哈希键周围加上引号。所以代替:$values->{scan-results}你会说:$values->{'scan-results'}

另请参阅:从 XML::Simple 升级到 XML::LibXML

编辑

您的代码中有该行print Dumper($values);。它产生的输出将回答您的问题(结合如果哈希键包含诸如“-”之类的非单词字符,则必须引用哈希键的知识)。如果您无法解释 Data::Dumper 的输出,那么您需要阅读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";
}
于 2013-05-29T22:41:28.757 回答