所以我试图用以下格式解析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";
}
非常感谢任何有关如何解决连字符(即用下划线替换它们)的建议。
答案 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";
}