如何使用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
,但我没有看到需要。
答
不知道您是否仍然感兴趣,但您可以将文档作为DOM检索并将xquery应用于DOM,或者可能更好,只需在您提交的查询中提取想要的信息到服务器。
事情是这样的:
for $p in doc("/db/LAB/foo-bar00/2011/5/23/11_15_33.xml")//output_rate
return
<vlaue>$p</value>
谢谢池上,但我没有问如何解析.xml文件,但如何检索存储在数据库中(没有文件的一个节点,换句话说,并从数据库中下载它来解析它将不会有效) – user690182 2011-05-25 10:58:26
@ user690182,我不知道'eXist'是一个库。没有链接到文档或任何东西。 – ikegami 2011-05-25 19:27:39