Невозможно извлечь значения из XML-файла, используя perl - PullRequest
0 голосов
/ 26 ноября 2018

Ниже приведен XML-файл:

<Build_details>
  <Release number="1902">
    <Build number="220">
      <OMS>
        <Build_path>ST_OMS_V19021_B220</Build_path>
        <Pc_version>8042.18.01</Pc_version>
      </OMS>
      <OMNI>
        <Build_path>ST_OMNI_V19021_B220</Build_path>
      </OMNI>
    </Build>
  </Release>
  <Release number="1810">
    <Build number="340">
      <OMS>
        <Build_path>ST_OMS_V1810_B340</Build_path>
        <Pc_version>8041.30.01</Pc_version>
      </OMS>
      <OMNI>
        <Build_path>ST_OMNI_V1810_B340</Build_path>
      </OMNI>
    </Build>
  </Release>
  <Release number="1810">
    <Build number="300">
      <OMS>
        <Build_path>ST_OMS_V18102_B300</Build_path>
        <Pc_version>8041.30.01</Pc_version>
      </OMS>
      <OMNI>
        <Build_path>ST_OMNI_V18102_B300</Build_path>
      </OMNI>
    </Build>
  </Release>
</Build_details>

Я не могу получить значения для того же номера выпуска с другим номером сборки.Предположим, я хочу получить подробную информацию для выпуска 1810, сборка 300, в которой выбрасывается пустое значение.Кажется, написанный мной perl-скрипт работает только для первого значения вхождения.

Ниже написан мой скрипт:

#!/appl/OMS/perl/bin/perl
=comments
Perl wrapper for parsing the central repository
xml to fetch relevant data of each release

Help Usage : ./parseenv.pl allrel -- to list all versions\
./parseenv.pl <relno> <buildno> <oms/pc/omni>
ex - ./parseenv.pl 1810 300 oms
Date=20180910
=cut

use XML::Smart;
use File::Path qw(make_path remove_tree);

$FILE="/appl/OMS/Build_Details/build_details.xml";

$xml = XML::Smart->new($FILE) || die ("Could not open XML file");
my $relno=$ARGV[0];
my $build=$ARGV[1];

if ( $ARGV[0] =~ "allrel" ) {
    my @release=$xml->{Build_details}->{Release}('[@]','number');
    foreach $i (@release) {
        print "$i\n";
    }
}

if ($ARGV[1] =~ "build") {
    my @build=$xml->{Build_details}->{Release}->('number','eq',"$relno")->{Build}('[@]','number');
    foreach $i (@build) {
        print "$i\n";
    }
}

if ($ARGV[2] =~ "oms") {
    my @oms=$xml->{Build_details}->{Release}->('number','eq',"$relno")->{Build}('number','eq',"$build")->{OMS}->{Build_path};
    print "@oms\n";

}
elsif ($ARGV[2] =~ "pc") {
    my @pc=$xml->{Build_details}->{Release}->('number','eq',"$relno")->{Build}('number','eq',"$build")->{OMS}->{Pc_version};
    print "@pc\n";

}
elsif ($ARGV[2] =~ "omni") {
    my @omni=$xml->{Build_details}->{Release}->('number','eq',"$relno")->{Build}('number','eq',"$build")->{OMNI}->{Build_path};
    print "@omni\n";

}
else {
    print "Please enter 3rd argument"
}

Подробности вывода:

Работает нормально для первого вхождения

$  ./parsebuilddetails.pl 1810 340 pc
8041.30.01

Не работает для другого случая:

$ ./parsebuilddetails.pl 1810 300 pc

Как я могу изменить скрипт perl, чтобы он работал для всех значений номера сборки.Кажется, мне придется добавить цикл.Но я не могу понять, как это будет повторяться.Пожалуйста, помогите:)

1 Ответ

0 голосов
/ 29 ноября 2018

Всегда используйте строгие и предупреждения прагмы!Просто пример XML :: LibXML:

#!/usr/bin/env perl                                                                                                                                                                            

use strict;
use warnings;

use XML::LibXML;

my $xml_string = join '', <DATA>;

my $dom = XML::LibXML->load_xml(string => $xml_string);


foreach my $build_node ($dom->findnodes('//Release[@number="1810"]/Build')) {
  print $build_node->to_literal;
}

__DATA__
...place your xml here

Хороший учебник для XML :: LibXML

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...