2

私は Perl で書いているアプリケーションのデータベースとして eXist を使用することに決め、それを試しています。問題は、次の構造の .xml ドキュメントを保存したことです

<foo-bar00>
    <perfdata datum="GigabitEthernet3_0_18">
        <cli cmd="whatsup" detail="GigabitEthernet3/0/18" find="" given="">
            <input_rate>3</input_rate>
            <output_rate>3</output_rate>
        </cli>
    </perfdata>
    <timeline>2011-5-23T11:15:33</timeline>
</foo-bar00>

" /db/LAB/foo-bar00/2011/5/23/11_15_33.xml" コレクションにあります。

次のように、正常にクエリできます

my $xquery = 'doc("/db/LAB/foo-bar00/2011/5/23/11_15_33.xml")' ;

または$xquery等しい = doc("/db/LAB/foo-bar00/2011/5/23/11_15_33.xml")/foo-bar00/perfdata/cli/data(output_rate) または = doc("/db/LAB/foo-bar00/2011/5/23/11_15_33.xml")/foo-bar00/data(timeline)

my ($rc1, $set) = $eXist->executeQuery($xquery) ;
my ($rc2, $count) = $eXist->numberOfResults($set) ;
my ($rc3, @data) = $eXist->retrieveResults($set) ;
$eXist->releaseResultSet($set) ;
print Dumper(@data) ;

結果は次のとおりです。

$VAR1 = {
  'hitCount' => 1,
  'foo-bar00' => {
    'perfdata' => {
      'cli' => {
        'given' => '',
        'detail' => 'GigabitEthernet3/0/18',
        'input_rate' => '3',
        'cmd' => 'whatsup',
        'output_rate' => '3',
        'find' => ''
      },
      'datum' => 'GigabitEthernet3_0_18'
    },
    'timeline' => '2011-5-23T11:15:33'
  }
};

---> 情報を取得したい xml ドキュメントを知っているとします。---> タイムライン情報を取得したいと考えています。

私が書いているとき:

my $db_xml_doc = "/db/LAB/foo-bar00/2011/5/23/11_15_33.xml" ;
my ($db_rc, $db_datum) = $eXist->queryXPath("/foo-bar00/timeline", $db_xml_doc, "") ;
print Dumper($db_datum) ;

結果は次のとおりです。

$VAR1 = {
  'hash' => 1717362942,
  'id' => 3,
  'results' => [
    {
      'node_id' => '1.2',
      'document' => '/db/LAB/foo-bar00/2011/5/23/11_15_33.xml'
    }
  ]
};

問題は、「タイムライン」情報を取得するにはどうすればよいですか? 「node_id」変数 (=1.2) は「タイムライン」情報を指すことができるようですが、どのように使用できますか?

ありがとうございました。

4

2 に答える 2

0

まだ興味があるかどうかはわかりませんが、ドキュメントを DOM として取得して xquery を DOM に適用するか、サーバーに送信するクエリで必要な情報だけを抽出することをお勧めします。

このようなもの:

for $p in doc("/db/LAB/foo-bar00/2011/5/23/11_15_33.xml")//output_rate
return
    <vlaue>$p</value>
于 2012-08-07T19:54:28.423 に答える
0
use XML::LibXML qw( );

my $parser = XML::LibXML->new();
my $doc    = $parser->parse_file('a.xml');
my $root   = $doc->documentElement();

my ($timeline) = $root->findnodes('timeline');
if ($timeline) {
    print("Exists: ", $timeline->textContent(), "\n");
}

また

my ($timeline) = $root->findnodes('timeline/text()');
if ($timeline) {
    print("Exists: ", $timeline->getValue(), "\n");
}

/foo-bar00/timelineの代わりにを使用することもできましたがtimeline、その必要性がわかりませんでした。

于 2011-05-23T18:47:26.990 に答える