2013-02-01 114 views
1

給定一個XPATH如「// ELEMENT_NAME」我想拉所形成的結構拼合的XPath,說: -從XML到Perl哈希

<element_name> 
    <tag1>value1</tag1> 
    <nested> 
    <tag2>value2</tag2> 
    </nested> 
</element_name> 

...然後壓平成哈希表: -

{ 'tag1' => 'value1', 
    'tag2' => 'value2' 
} 

所以,基本上我去深,我可以到樹上,當我不能去任何更深的我寫的哈希值。

元素值將始終是唯一的。如果由於某種原因他們不是,我不介意他們覆蓋散列。

這顯然需要一些遞歸。但我的問題是哪個Perl XML解析器是最好的實現呢?代碼結構上的任何指針也都很讚賞。最終的結果將是一個SQL語句,因此標籤的唯一性。我無法直接導入XML,因爲某些標籤需要進一步處理。

回答

1

聽起來像你知道如何找到element_name元素,所以我會從那裏繼續。


你想有沒有子元素的元素

  1. 是的 ELEMENT_NAME元素後裔,
  2. 的名稱和文本內容。

您可以使用下面的XPath來查找這些節點:

descendant::*[count(*)=0] 

備選:

.//*[count(*)=0] 

隨着XML ::的libxml,全缺失的部分看起來像:

for my $tag_node ($element_node->findnodes('descendant::*[count(*)=0]')) { 
    my $name = $tag_node->nodeName(); 
    my $text = $tag_node->textContent(); 
    $hash{$name} = $text; 
}