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