Как работать с 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";
}
Другие вопросы по тегам