Как работать с 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 ответ
Вам просто нужно поместить кавычки вокруг ваших хэш-ключей. Так что вместо: $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";
}