2011-05-23 28 views
2

我決定使用eXist作爲我使用Perl編寫的應用程序的數據庫,並且我正在嘗試使用它。問題是,我已存儲的結構如下如何使用XPath查詢eXist?

<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> 

爲.xml文件,它位於「/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)可以指向「時間軸」信息,但我該如何使用它?

謝謝。

回答

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,但我沒有看到需要。

+0

謝謝池上,但我沒有問如何解析.xml文件,但如何檢索存儲在數據庫中(沒有文件的一個節點,換句話說,並從數據庫中下載它來解析它將不會有效) – user690182 2011-05-25 10:58:26

+0

@ user690182,我不知道'eXist'是一個庫。沒有鏈接到文檔或任何東西。 – ikegami 2011-05-25 19:27:39

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>