如何使用XPath查询eXist?

问题描述:

我决定使用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)可以指向“时间轴”信息,但我该如何使用它?

谢谢。

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

不知道您是否仍然感兴趣,但您可以将文档作为DOM检索并将xquery应用于DOM,或者可能更好,只需在您提交的查询中提取想要的信息到服务器。

事情是这样的:

for $p in doc("/db/LAB/foo-bar00/2011/5/23/11_15_33.xml")//output_rate 
return 
    <vlaue>$p</value>