Parsing xml into array usando xmllint

0

Eu tenho um arquivo xml com vários elementos <db> , eu preciso extrair atributos de cada nó e fazer algum trabalho neles.

É possível carregá-los para array, usando ksh e xmllint?

Isso é o que eu tenho:

arquivo xml:

<?xml version="1.0"?>
<main>
  <resources>
        <db>
           <table_name tableid="001" user="mike">customer</table_name>
        </db>
    <db>
           <table_name tableid="002" user="david">orders</table_name>
        </db>
   </resources>
</main>

script:

#!/usr/bin/ksh

tbid="$(echo "cat /main/resources/db/table_name/@tableid" | xmllint --shell data.xml )"
username="$(echo "cat /main/resources/db/table_name/@user" | xmllint --shell data.xml )"

echo $tbid
echo $username

Saída:

/ > ------- tableid="001" ------- tableid="002" / >
/ > ------- user="mike" ------- user="david" / >

eventualmente, eu quero pegar um tipo de matriz 2-dim:

arr[0],[0]=001
arr[0],[1]=mike

arr[1],[0]=002
arr[1],[1]=david

Notas:
xpath não é suportado no xmllint e não pode ser instalado.
array pode ser representado de qualquer outra forma, eu só preciso extrair e fazer algum trabalho.

    
por markiz 17.12.2015 / 16:10

1 resposta

0

Eu vou oferecer como eu lidaria com isso, porque você ainda não tem nenhuma resposta - eu usaria o excelente módulo XML::Twig e perl :

#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig -> new -> parsefile ( 'data.xml' );

foreach my $table ( $twig -> get_xpath('//table_name') ) {
   print $table -> att('tableid'), " => ", $table -> att('user'), "\n";
}

Isto imprime:

001 => mike
002 => david

O Perl tem uma estrutura de dados embutida chamada hash, que pode atender às suas necessidades também (dependendo do que você está querendo):

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
use XML::Twig;

my $twig = XML::Twig -> new -> parse ( \*DATA );

my %table_for;
foreach my $table ( $twig -> get_xpath('//table_name') ) {
   my $tableid = $table -> att('tableid');
   my $user = $table -> att('user'); 
   $table_for{$user} = $tableid;
}

print Dumper \%table_for; 

Você pode iterar chaves em %table_for (há muitas possibilidades, mas vou precisar de uma ideia do que você deseja expandir nelas)

    
por 21.12.2015 / 18:57