2015-10-13 47 views
0

這裏是我的xml文件如何從一個XML文件顯示節點的子元素,在Python?

<root> 
     <Module name="ac4" offset="32" width="12"> 
      <register name="xga_control" offset="0x000" width="32" access="R/W"> 

       <field name="reserved" offset="0" bit_span="5"/> 

       <field name="force_all_fault_clear" bit_span="1" default="0"> 
        <description>Rising edge forces all fault registers to clear</description> 
       </field> 

       <field name="force_warning" default="0" bit_span="1"> 
        <description>Forces AC2 to report a Master Warning</description> 
       </field> 

       <field name="force_error" default="0" bit_span="1"> 
        <description>Forces AC2 to report a Master Error</description> 
       </field> 
      </register> 
     </Module> 

<root> 

現在我可以訪問我註冊的名稱,並顯示出來。不過,我也想顯示我的字段元素的名稱和屬性。我怎樣才能做到這一點?這是我的代碼到目前爲止。

input_file = etree.parse('file1.xml') 
output=open("ac4.vhd","w+") 

    output.write("Registers \n") 
    for node in input_file.iter(): 
     if node.tag=="register": 
      name=node.attrib.get("name") 
      print(name) 
      output.write(name) 
      output.write("\n") 
      if node.tag=="field": 
       name=node.attrib.get("name") 
       output.write(name) 

現在輸出看起來像

Registers 
xga_control 
i_cmd_reg 

我希望它看起來像

Registers 
xga_control 
    reserved   
    force_all_fault_clear 
    force_warning 
    force_error 
i_cmd_reg 
    field name 
    field name 

如何做到這一點任何想法?相反,在迭代的input_file.iter()

+1

你肯定有一個缺口問題。 '如果node.tag == 「場」:'是'如果node.tag == 「寄存器」 內:'塊。由於nod.tag永遠是「場」,如果它已經是「註冊」,這絕不會是真的。 – RobertB

回答

1

你可以做input_file.getroot()並通過系統地迭代。

這是你將如何編寫代碼:

import xml.etree.ElementTree as ET            

tree = ET.parse('file1.xml')              

root = tree.getroot()                

with open('ac4.vhd', 'w+') as fd:             
    fd.write('Registers\n')              
    for node in root:                
     if node.tag == 'Module':             
      for sub_node in node:             
       fd.write('{0}\n'.format(sub_node.get('name')))     
       for child in sub_node:           
        fd.write('\t{0}\n'.format(child.get('name'))) 

你的輸出變爲:

Registers 
xga_control 
    reserved 
    force_all_fault_clear 
    force_warning 
    force_error 
+0

謝謝你的解決方案!我一直使用input_file.iter(),它不能使用根方法。 – GoldenEagle

相關問題