как прочитать значение спецификационного тега c внутри xml, используя perl - PullRequest
1 голос
/ 03 марта 2020

Для проверки ниже 1. xml

<root>
  <setup name = "abc" version="1.1.1>
    <func>
       <comp name = "cba">
          <check>type</check>  
       </comp> 
    </func>
  </setup> 
</root>

Я могу извлечь содержимое поля comp, используя следующую команду:

my $lib = "check1.xml"; 
my $simple = XML::Simple->new();
my $tree = $simple->XMLin($lib);
print $tree->{setup}->{func}->{comp}->{name} ;

С этим я могу напечатать " cba ". Я напечатал дерево $ с функцией Dumper, чтобы получить ха sh, и мне удалось создать синтаксис для печати того же самого.

Однако, когда у меня есть несколько теги comp, у меня проблемы.

<root>
  <setup name = "abc" version="1.1.1">
    <func>
       <comp name = "cba">
          <check>type</check>  
       </comp> 
       <comp name = "cdf">
          <check>semi</check>  
       </comp> 
       <comp name = "mno">
          <check>auto</check>  
       </comp> 
       <comp name = "xyz">
          <check>manual</check>  
       </comp>     
    </func>
  </setup> 
</root>

Как мне получить значения здесь, например, когда я дам дамп га sh для этого, я не получаю тот же тег, что и я посмотрите любой элемент, к которому я могу получить доступ в ha sh, чтобы получить необходимую информацию.

$VAR1 = {
          'setup' => {
                     'func' => {
                               'comp' => {
                                         'cdf' => {
                                                  'check' => 'semi'
                                                },
                                         'mno' => {
                                                  'check' => 'auto'
                                                },
                                         'cba' => {
                                                  'check' => 'type'
                                                },
                                         'xyz' => {
                                                  'check' => 'manual'
                                                }
                                       }
                             },
                     'name' => 'abc',
                     'version' => '1.1.1'
                   }
        };

Я хотел бы извлечь значения имени компа из вышеупомянутого ha sh в массив. Может кто-нибудь дать мне несколько советов здесь. то есть получить cdf, mno, xyz, cba ...

Ответы [ 2 ]

1 голос
/ 03 марта 2020

$tree->{setup}->{func}->{comp} является ссылкой ha sh, где атрибуты name являются ключами, поэтому

@comp_names = keys %{$tree->{setup}{func}{comp}};
1 голос
/ 03 марта 2020

Это большая причина, по которой XML :: Simple не рекомендуется . XML просто бесполезно отображается на Perl структуры данных, поэтому небольшая разница в возвращаемых XML требует совсем другой Perl структуры данных.

Вместо синтаксического анализатора XML, подобного XML :: Lib XML или Mojo :: DOM может проходить и извлекать данные согласованным образом, независимо от того, сколько предметов вы получите. Вот как вы можете подойти к этому с Mojo :: DOM:

use strict;
use warnings;
use Mojo::DOM;

my $xml = <<'XML';
<root>
  <setup name = "abc" version="1.1.1">
    <func>
       <comp name = "cba">
          <check>type</check>  
       </comp> 
       <comp name = "cdf">
          <check>semi</check>  
       </comp> 
       <comp name = "mno">
          <check>auto</check>  
       </comp> 
       <comp name = "xyz">
          <check>manual</check>  
       </comp>     
    </func>
  </setup> 
</root>
XML

my $dom = Mojo::DOM->new->xml(1)->parse($xml);
my $names = $dom->find('root > setup > func > comp')->map(attr => 'name');
print "$_\n" for @$names;

# equivalent, in more steps:
my $comps = $dom->find('root > setup > func > comp');
foreach my $comp (@$comps) {
  print $comp->attr('name'), "\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...