我想提取XML的屬性值考慮層級:的Perl和XPath:考慮層次
<?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代碼我提取值:
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獲得所有屬性值。這不是什麼iw螞蟻。我想只輸出correpondent級別1的水平2項,但我要的是:
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
我將不勝感激任何提示如何解決這個問題。
謝謝。
非常感謝您的回答。我改變了你的建議。輸出現在只給出來自1級(狐狸,馬,蜜蜂,黃蜂)沒有對應的2級值的屬性值。如果$ node1不是節點,它是什麼? $ element1會更好嗎?或$ level1? – giordano 2014-09-02 15:54:05
'$ node1_list'或'$ animals'是兩種可能性。測試 – ikegami 2014-09-02 15:58:57
哦,這是因爲你的XML沒有意義。儘管您的縮進意味着否則,所有'row1'元素都沒有'row2s'子元素。我想你的意思是使用' '你確定修正XML ,還是你需要與你擁有的代碼一致的代碼? –
ikegami
2014-09-02 16:06:00