
複数の要素を含む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
(可能性はたくさんありますが、キーを拡張したいターゲットが何であるかを理解する必要があります)。