xmllintを使用してxmlを配列に解析します。

xmllintを使用してxmlを配列に解析します。

複数の要素を含むXMLファイルがあり、<db>各ノードから属性を抽出し、それに対していくつかの処理を実行する必要があります。

kshとxmllintを使用して配列にロードできますか?

これが私が持っているものです:

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>

スクリプト:

#!/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

出力:

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

最終的に一種の2D配列を手に入れたいです。

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

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

注:
xmllintはxpathをサポートしていないため、インストールできません。
配列はさまざまな方法で表現できます。単に配列を抽出していくつかの操作を実行できるだけです。

ベストアンサー1

まだ答えがないので、この問題を解決する方法を提供します。優れたモジュールXML::Twigと以下を使用します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";
}

これは以下を印刷します:

001 => mike
002 => david

Perlにはハッシュという組み込みのデータ構造があり、これはあなたのニーズにも適している可能性があります(必要に応じて異なります)。

#!/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; 

キーを繰り返すことができます%table_for(可能性はたくさんありますが、キーを拡張したいターゲットが何であるかを理解する必要があります)。

おすすめ記事