2015-11-02 5 views
2

etree для отображения моего xml-файла и отлично работает для отображения атрибутов определенного элемента, но теперь мне нужно отобразить содержимое элемента.Отображение содержимого элемента в xml с помощью python

Входной XML

<root> 
    <Module> 
     <register name="i_cmd_reg" offset="0x004" width="20" access="R/W" > 
      <field name="value" default="0" bit_span="20"> 
       <description>System gradient driver current command - 1.72mA/LSB</description> 
      </field> 
     </register> 

     <register name="i_ecc_cmd_reg" offset="0x008" width="20" access="R/W" > 
      <description>Calculated ECC current command - 1.72mA/LSB</description> 
      <field name="field1"/> 
     </register> 

    </Module>  
</root> 

код Python

from lxml import etree 

xml_file = etree.parse('file1.xml') 


input_1=open("sample_template.txt","r") 
output=open("output.txt","w+") 

i=0 
k=0 
for node in input_file.iter(): 
    if node.tag=="register": 
     register[i]['name']=node.attrib.get("name") 
     register[i]['offset']=node.attrib.get("offset") 

     k=0 
     for child_node in node: 
      if child_node.tag=="field": 
       register[i]['fields'][k]['name']=child_node.attrib.get("name") 
       register[i]['fields'][k]['offset']=child_node.attrib.get("offset") 
       k+=1 

Мой вопрос, как я могу хранить содержимое элемента описания, в сказать строковую переменную? Мне просто нужно получить доступ к данным в элементе описания.

как имя = child_node.tag ("Описание")

Спасибо!

ответ

1

Вы можете сделать это:

  • Использование ElementTree разобрать и получить корень
  • Перебор "зарегистрировать" дети с root.iter ('дети')
  • Письменность некоторая логика для поиска на основе структуры вашего документа

Код:

import xml.etree.ElementTree as ET 

tree = ET.parse('file.xml') 
root = tree.getroot() 

for child in root.iter('register'): 
    name = child.attrib.get('name', None) 
    offset = child.attrib.get('offset', None) 
    width = child.attrib.get('width', None) 
    access = child.attrib.get('access', None) 
    description = child.find('description') 

    if description is not None: 
     desc = description.text 
    else: 
     desc = child.find('field').find('description').text 

    print "[*] Register Name: {}".format(name) 
    print "[*] Register Offset: {}".format(offset) 
    print "[*] Register Width: {}".format(width) 
    print "[*] Register Access: {}".format(access) 
    print "[*] Description: {}".format(desc) 
    print "" 

Другой код с etree из LXML:

from lxml import etree 

with open('file.xml') as xml_file: 
    tree = etree.fromstring(xml_file.read()) 

for child in tree.xpath('//root/Module/register'): 
    name = ''.join(child.xpath('./@name')) 
    offset = ''.join(child.xpath('./@offset')) 
    width = ''.join(child.xpath('./@width')) 
    access = ''.join(child.xpath('./@access')) 
    description = ''.join(child.xpath('.//description/text()')) 

    print "[*] Register Name: {}".format(name) 
    print "[*] Register Offset: {}".format(offset) 
    print "[*] Register Width: {}".format(width) 
    print "[*] Register Access: {}".format(access) 
    print "[*] Description: {}".format(description) 
    print "" 

Выход одинакова для обоих примеров:

[*] Register Name: i_cmd_reg 
[*] Register Offset: 0x004 
[*] Register Width: 20 
[*] Register Access: R/W 
[*] Description: System gradient driver current command - 1.72mA/LSB 

[*] Register Name: i_ecc_cmd_reg 
[*] Register Offset: 0x008 
[*] Register Width: 20 
[*] Register Access: R/W 
[*] Description: Calculated ECC current command - 1.72mA/LSB 
+0

Привет спасибо за ответ! Просто чтобы вы знали, я использовал первый ответ как часть моего кода lxlml.etree – GoldenEagle

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