2015-03-01 1 views
0

Я создаю файл Python, который обменивается данными с ПЛК. При компиляции ПЛК создает XML-файл, который предоставляет важную информацию о программе. XML выглядит примерно так:Как получить дочерний элемент ребенка с помощью ElementTree Python

<visu> 
    <time>12:34</time> 
    <name>my_visu</name> 
    <language>english</language> 
    <vars> 
     <var name="input1">2</var> 
     <var name="input2">45.6</var> 
     <var name="input3">"hello"</var> 
    </vars> 
</visu> 

Важная часть находится под дочерними «варами». Используя Python, я хочу создать файл, который при отправке аргумента «input2» будет печатать «45,6».

До сих пор я мог читать всех детей «visu», но не знаю, как на самом деле сказать Python искать среди «ребенка ребенка». Вот что я получил до сих пор:

tree = ET.parse("file.xml") 
root = tree.getroot() 
for child in root: 
    if child.tag == "vars": 
     ....... 
     if ("childchild".attrib.get("name") == "input2"): 
      print "childchild".text 

Любые идеи, как я могу завершить сценарий? (? Или, может быть, более эффективный способ программирования его)

ответ

1

Вы бы лучше использовать в XPath search здесь:

name = 'input2' 
value = root.find('.//vars/var[@name="{}"]'.format(name)).text 

Это ищет <var> тэгом непосредственно ниже <vars> тег, атрибут которого name является равное значению, заданному переменной Python name, затем извлекает текстовое значение этого тега.

Демо:

>>> from xml.etree import ElementTree as ET 
>>> sample = '''\ 
... <visu> 
...  <time>12:34</time> 
...  <name>my_visu</name> 
...  <language>english</language> 
...  <vars> 
...   <var name="input1">2</var> 
...   <var name="input2">45.6</var> 
...   <var name="input3">"hello"</var> 
...  </vars> 
... </visu> 
... ''' 
>>> root = ET.fromstring(sample) 
>>> name = 'input2' 
>>> root.find('.//vars/var[@name="{}"]'.format(name)).text 
'45.6' 

Вы можете сделать это трудный путь, и вручную цикл по всем элементам; каждый элемент может быть накинут непосредственно:

name = 'input2' 
for elem in root: 
    if elem.tag == 'vars': 
     for var in elem: 
      if var.attrib.get('name') == name: 
       print var.text 

но с использованием element.find() или element.find_all(), вероятно, будет проще и более кратким.

+0

Спасибо, что ответили, я найду решение с помощью find(). –