我想使用XML::DOM
模塊解析簡單的XML文檔以哈希。在Perl中使用XML :: DOM構建哈希樹
<?xml version ="1.0"?>
<Select>
<book>
<prop Name = "prop1" Title = "title1" />
<prop Name = "prop2" Title = "title2" />
</book>
<fruit>
<prop Name = "prop3" Title = "title3" />
<prop Name = "prop4" Title = "title4" />
</fruit>
</Select>
和預期輸出是 -
$VAR1 = {
Select => {
book => {
prop => [
{ Name => "prop1", Title => "title1" },
{ Name => "prop2", Title => "title2" },
],
},
fruit => {
prop => [
{ Name => "prop3", Title => "title3" },
{ Name => "prop4", Title => "title4" },
],
},
},
}
我寫這是代碼:
use strict;
use XML::DOM;
use Data::Dumper;
my @stack;
my %hash;
push @stack,\%hash;
my $parser = new XML::DOM::Parser;
my $doc = $parser -> parsefile('demo.xml');
my $root = $doc->getDocumentElement();
my $rootnode = $root->getTagName;
################################################################
foreach my $node ($doc->getElementsByTagName($rootnode)){
push @stack,$stack[$#stack]->{$rootnode};
my @childnode = $node->getChildNodes();
foreach my $child(@childnode){
if($child->isElementNode){
my $childname = $child->getNodeName();
pop(@stack);
push @stack,$stack[$#stack]->{$rootnode} = {$childname,{}};
my @childnodes2 = $child->getChildNodes();
foreach my $subchild(@childnodes2){
if($subchild->isElementNode){
my $subchildname = $subchild->getNodeName();
my $name = $subchild->getAttributes->getNamedItem('Name')->getNodeValue;
my $title = $subchild->getAttributes->getNamedItem('Title')->getNodeValue;
pop(@stack);
push @stack,$stack[$#stack]->{$rootnode}->{$child->getNodeName()} = {$subchildname,{}}; #{} contains $name or $title
}
}
}
}
}
print Dumper(\%hash);
我想,我是不是能夠正確地推動和陣列彈出。另外,我不想使用XML::Simple
和遞歸。
我該如何在Perl中做到這一點?
你可能會定義(散文或僞代碼),什麼規則產生所需的輸出?看來你要正確對待屬性爲子標籤(' '像'巴茲 '),以及您希望將多個標籤到一個數組,如果他們是兄弟姐妹,同名。或者這個解析的目的只是爲了填補'prop'字段,而其餘的結構是不變的? –
amon
也請擴展你的意思是「XML :: Simple and recursion」以及你爲什麼要避免它。 – Borodin
@amon是的你是對的。期望的輸出是在XML :: Simple庫的幫助下生成的。我只是想找到一種方法,用XML :: DOM的幫助,而不使用,因爲內存的任何遞歸函數要做到這一點限制了當XML成爲大 – Maverick