Perl和Xpath:考虑层次结构 [英] Perl and Xpath: considering hierarchy
问题描述
我想考虑层次结构级别来提取XML的属性值:
I would like to extract the attribute values of an XML considering the hierarchy level:
<?xml version="1.0" encoding="UTF-8"?>
<database>
<row1s>
<row1 name="fox" category="mammal">
<row2s>
<row2 type="1"/>
<row2 type="2"/>
</row2s>
</row1>
<row1 name="horse" category="mammal">
<row2s>
<row2 type="3"/>
</row2s>
</row1>
<row1 name="bee" category="insect">
<row2s/>
</row1>
<row1 name="wasp" category="insect">
<row2s/>
</row1>
</row1s>
</database>
这是我提取值的Perl代码:
This is the Perl-code I extract the values:
use strict;
use DBI;
use XML::XPath;
use XML::XPath::XMLParser;
my $xrow1;
my $xrow2;
my $xp = XML::XPath->new (filename => "animals3.xml");
my $node_list1 = $xp->find ("//row1s/row1");
foreach my $row1 ($node_list1->get_nodelist ()) {
$xrow1 = $row1->getAttribute("name");
print "Level row1 gives: $xrow1\n";
my $node_list2 = $xp->find ("//row2s/row2");
foreach my $row2 ($node_list2->get_nodelist ()) {
$xrow2 = $row2->getAttribute("type");
print "Level row2 gives: $xrow2\n";
}
}
我得到的是:
Level row1 gives: fox
Level row2 gives: 1
Level row2 gives: 2
Level row2 gives: 3
Level row1 gives: horse
Level row2 gives: 1
Level row2 gives: 2
Level row2 gives: 3
Level row1 gives: bee
Level row2 gives: 1
Level row2 gives: 2
Level row2 gives: 3
Level row1 gives: wasp
Level row2 gives: 1
Level row2 gives: 2
Level row2 gives: 3
对于每个级别1,我都从级别2获得所有属性值.这不是我想要的.我只想输出对应级别1的级别2条目.但是我想要的是:
For each level 1 I get all attribute values from level 2. This is not that what i want. I would like to output only the the level 2 entries of the correpondent level 1. But what I want is:
Level row1 gives: fox
Level row2 gives: 1
Level row2 gives: 2
Level row1 gives: horse
Level row2 gives: 3
Level row1 gives: bee
Level row1 gives: wasp
任何解决方法的提示,我将不胜感激.
I would appreciate any hint how to solve this problem.
谢谢.
推荐答案
前导/
表示绝对路径.
my $node2 = $xp->find("//row2s/row2");
应该是
my $node2 = $xp->find("row2s/row2", $row1);
评论:
Comments:
-
$node1
和$node2
都不是节点.选择更好的名字.
Neither
$node1
nor$node2
are nodes. Pick better names.
在执行变量的地方声明变量部分地违反了声明变量的目的.应该在适当的循环中声明它们.
Declaring your variables where you did partially defies the purpose of declaring them. they should be declared within the appropriate loops.
这篇关于Perl和Xpath:考虑层次结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!