Как извлечь значения из XML-файла с помощью Perl XML :: Simple? - PullRequest
2 голосов
/ 22 сентября 2010

Учитывая, что XML :: Simple является единственным модулем, который можно использовать, я застрял в получении значений из XML. Структура идет ниже:

<testxml>
    <dev>
        <A>
            <tables>
                <datatables>
                    <table>a1</table>
                    <table>a2</table>
                    <table>a3</table>
                </datatables>
                <propertytables>
                    <table>A1</table>
                    <table>A2</table>
                </propertytables>
            </tables>
        </A>
        <B>
            <tables>
                <datatables>
                    <table>b1</table>
                    <table>b2</table>
                </datatables>
                <propertytables>
                    <table>B1</table>
                    <table>B2</table>
                </propertytables>
            </tables>
        </B>
    </dev>
</testxml>

XMLOut:

<opt>
  <dev name="A">
    <tables name="datatables">
      <table>a1</table>
      <table>a2</table>
      <table>a3</table>
    </tables>
    <tables name="propertytables">
      <table>A1</table>
      <table>A2</table>
    </tables>
  </dev>
  <dev name="B">
    <tables name="datatables">
      <table>b1</table>
      <table>b2</table>
    </tables>
    <tables name="propertytables">
      <table>B1</table>
      <table>B2</table>
    </tables>
  </dev>
</opt>

Как получить массив таблиц, скажем, для этого условия:
dev name = "B" и таблиц name = "propertytables" # для вывода B1, B2

Ответы [ 2 ]

3 голосов
/ 22 сентября 2010

Это неправда, что XML :: Simple является единственным модулем, который используется для этой роли. Для чего-то подобного я бы использовал XML :: LibXML с небольшим количеством XPath.

Но если вы хотите использовать XML :: Simple, я считаю, что лучший подход - это использовать Data :: Dumper для вывода структуры данных, которую строит XML :: Simple, и использовать этот дамп для разработки наилучшего способа обхода структура. В вашем случае все довольно просто.

#!/usr/bin/perl

use strict;
use warnings;

use XML::Simple;
use Data::Dumper;

my $xml = do { local $/; <DATA> };

my $doc = XMLin($xml);

# print Dumper $doc;

my $dev = 'B';
my $table = 'propertytables';

foreach (@{$doc->{dev}{$dev}{tables}{$table}{table}}) {
  print "$_\n";
}

__END__
<opt>
  <dev name="A">
    <tables name="datatables">
      <table>a1</table>
      <table>a2</table>
      <table>a3</table>
    </tables>
    <tables name="propertytables">
      <table>A1</table>
      <table>A2</table>
    </tables>
  </dev>
  <dev name="B">
    <tables name="datatables">
      <table>b1</table>
      <table>b2</table>
    </tables>
    <tables name="propertytables">
      <table>B1</table>
      <table>B2</table>
    </tables>
  </dev>
</opt>
2 голосов
/ 22 сентября 2010
$ref->{dev}{B}{tables}{propertytables}{table}

будет ссылкой, а

@{ $ref->{dev}{B}{tables}{propertytables}{table} }

будет списком.

Но на самом деле сделайте

my $ref = XMLin( $some_source );
use Smart::Comments;
### $ref 

# ... OR ...

use Data::Dumper;
print Data::Dumper->Dump( [ $ref ], [ '*ref' ] );

, чтобы исследовать структуру и посмотреть, каким будет путь.

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