2015-07-24 5 views
2

Я новичок в этом, поэтому, пожалуйста, будьте терпеливы.Поиск родителя от дочернего элемента в XML с использованием python

Использование ETree и Python 2.7, я пытаюсь проанализировать большой файл XML, который я не создавал. В принципе, файл содержит группы вокселей, содержащихся в большом объеме. Общий формат:

<things> 
    <parameters> 
     <various parameters> 
    </parameters> 
    <thing id="1" comment="thing1"> 
     <nodes> 
      <node id="1" x="1" y="1" z="1"/> 
      <node id="2" x="2" y="2" z="2"/> 
     </nodes> 
     <edges> 
      <edge source="1" target="2"/> 
     </edges> 
    </thing> 
    <thing id="N" comment="thingN"> 
     <nodes> 
      <node id="3" x="3" y="3" z="3"/> 
      <node id="4" x="4" y="4" z="4"/> 
     </nodes> 
     <edges> 
      <edge source="3" target="4"/> 
     </edges> 
    </thing> 
    <comments> 
     <comment node="1" content="interesting feature"/> 
     <comment node="4" content="interesting feature"/> 
    </comments> 
</things> 

А «узел» содержит координаты воксела и «вещь» представляет собой группу вокселей. «Комментарии» используются для выделения интересующих узлов.

я могу найти атрибуты отдельных узлов «ид» с помощью команды поиска, например:

for elem in things.iterfind('thing/nodes/node[@id="221"]'): 
    x = int(elem.get('x')) 

Я хотел бы быть в состоянии определить «вещь идентификатор», к которому любой «идентификатор узла» принадлежит (например, узел 3 находится в веществе N). Я знаю, что я могу сделать это, используя цикл for, итерацию через вещи, а затем узлы, но я предполагаю, что должен быть какой-то способ сделать это проще, найдя родителя из дочернего элемента.

Я пробовал все варианты:

elem.find(..) 

, что я могу думать, но я получаю либо

«Отсутствует тип» или SyntaxError ("не может использовать абсолютный путь на элементе «)

Я попробовал команду LXML GetParent() тоже, как это было предложено в ответ на аналогичный запрос здесь: Get parent element after using find method (xml.etree.ElementTree) но не Ava ил.

Должен ли я определять классы в этом файле, чтобы иметь полный доступ к инструментам XPath?

+0

Проверить эту нить http://stackoverflow.com/questions/2170610/access-elementtree- узел-родитель-узел – ate50eggs

ответ

4

Вы должны пройти один уровень вверх

for elem in things.iterfind('thing/nodes/node[@id="1"]'): 
    # get parent of node - nodes 
    print elem.getparent() 
    # get grand parent of node - thing 
    print elem.getparent().getparent() 
    # now lets get the thing id 
    print elem.getparent().getparent().attrib.get('id') 
0

Вы также можете использовать

for elem in things.iterfind('thing/nodes/node[@id="1"]'): 
    # get parent of nodes, i.e. ancestor of node 
    parent = elem.xpath('ancestor::thing')[0] 
    # get the thing id 
    print parent.get('id') 

Таким образом, вам не придется вводить GetParent() дважды, и это ясно, кто является предок.

-1

for all_tags in xmlTree.findall('.//'): родитель = xmlTree.find ('.//% s/..' % all_tags.tag)

Смежные вопросы