2012-03-11 82 views
10

我想使用解析XML文件Perl。我能夠使用XML :: Simple模塊來實現,但現在我想要開始使用XML :: XPath模塊,而不是使用XPath表達式。從我有限的知識中,我認爲XPath將使未來的解析更容易,對吧? 這裏的Perl代碼我到目前爲止:Perl,如何解析XML文件,xpath

use strict; 
use warnings; 
use XML::XPath; 

my $file = "data.xml"; 
my $path = XML::XPath->new(filename => $file); 

my $name = $path->find('/category/event/@name'); 
print $name."\n"; 

我的問題是我怎麼分隔每個name屬性(類別/事件/ @),這樣我可以對每個I解析值測試。目前,我只是得到一大堆完整的解析數據,而我想要幾個可以測試的小字符串。我怎樣才能做到這一點?感謝:-)

回答

18

This review指出XML::XPath尚未從2003年開始更新,並建議XML::LibXML代替

use 5.010; 
use strict; 
use warnings; 
use XML::LibXML; 

my $dom = XML::LibXML->new->parse_file('data.xml'); 
for my $node ($dom->findnodes('/category/event/@name')) { 
    say $node->toString; 
} 

XML::LibXML::ParserXML::LibXML::Node

+3

你推薦'XML :: LibXML',因爲你應該知道它,或者因爲你認爲它比'XML的真正優勢: :XPath'?據我所知,後者工作正常。它也是純粹的Perl,它比LibXML慢,但可以在沒有外部庫的幫助下使用。 – Borodin 2012-03-11 02:33:03

+3

那是一個超鏈接。遵循它。 – daxim 2012-03-11 02:46:54

+0

@daxim感謝您的回覆。我試過它工作,但不是100%的我想要的方式。我的輸出是name =「attribute_value」,但我只想要attribute_value。有沒有辦法只輸出attribute_value而不使用name =「」? – liverpaul 2012-03-11 09:23:53

7

find方法返回一個XML::XPath::NodeSet對象,它是找到的所有節點的集合。我無法想象你可以做什麼來看到一個具有所有屬性值的長字符串。

檢索到節點集後,您可以使用size,get_nodeget_nodelist(請參閱上文鏈接的文檔)等方法處理其內容。 get_nodelist將返回一個Perl列表,在這種情況下,它還有其自己的方法的XML::XPath::Node::Attribute對象。這個程序應該讓你開始

use strict; 
use warnings; 

use XML::XPath; 

my $xp = XML::XPath->new(ioref => \*DATA); 

my $names = $xp->find('/category/event/@name'); 

for my $node ($names->get_nodelist) { 
    say $node->getNodeValue; 
} 


__DATA__ 
    <category name="a"> 
    <event name="cat1" /> 
    <event name="cat2" /> 
    <event name="cat3" /> 
    <event name="cat4" /> 
    <event name="cat5" /> 
    </category> 

輸出

cat1 
cat2 
cat3 
cat4 
cat5 
+0

感謝您的回覆。閱讀daxim發佈的鏈接後,我決定改用XML :: LibXML。它似乎是那裏最好的一個,所以作爲一個初學者,我認爲對我來說學習一個更好記錄的模塊會更好。我很欣賞你寫的介紹信息,它幫助我理解了一些更好的東西:-) – liverpaul 2012-03-11 09:04:14

+0

使用'XML :: XPath',我們可以在路徑內使用'^'或'*'嗎? EX:'my $ names = $ xp-> find('/ category/eve *');'.Inside'category',搜索以'eve'開頭的標籤 – Venkatesh 2015-09-12 16:36:56