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(가능성은 많지만 키를 확장하려는 대상이 무엇인지 이해해야 합니다).

관련 정보