2013-02-01 5 views
1

Дан XPATH, такие как '// ELEMENT_NAME' Я хочу, чтобы вытащить полученную структуру, скажет: -Flatten 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; 
} 
Смежные вопросы