使用 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" / >

最终,我想得到一种二维数组:

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(有很多可能性,但我需要了解您想要扩展它们的内容)

相关内容