在python中修改节点并从xml文件中提取数据

在python中修改节点并从xml文件中提取数据,python,xml,Python,Xml,我是python新手,我正在寻找关于执行以下任务的最佳方法的建议: 我有一个如下所示的xml文件 <component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009 http://www.spiritconsortium.org/XMLSche

我是python新手,我正在寻找关于执行以下任务的最佳方法的建议:

我有一个如下所示的xml文件

<component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009/index.xsd">
  <memoryMaps>
    <memoryMap>
      <name>name</name>
      <description>description</description>
      <peripheral>
        <name>periph</name>
        <description>description</description>
        <baseAddress>0x0</baseAddress>
        <range>0x8</range>
        <width>32</width>
        <register>
          <name>reg1</name>
          <displayName>reg1</displayName>
          <addressOffset>0x0</addressOffset>
          <size>32</size>
          <access>read-write</access>
          <reset>
            <value>0x00000002</value>
            <mask>0xFFFFFFFF</mask>
          </reset>
          <field>
            
          </field>
          </register>
      </peripheral>
    </memoryMap>
  </memoryMaps>
</component>

名称
描述
外围
描述
0x0
0x8
32
reg1
reg1
0x0
32
读写
0x00000002
0xFFFFFF
我想做一些修改,将“重置”节点修改为两个单独的节点,一个用于“重置值”,另一个用于“重置掩码”,但保留提取到“重置值”和“重置掩码”中的“值”和“掩码”中相同的数据,如下所示:

          ........
          <access>read-write</access>
          <resetValue>0x00000002</resetValue>
          <resetMask>0xFFFFFFFF</resetMask>
          <field>
           .............
。。。。。。。。
读写
0x00000002
0xFFFFFF
.............
我成功地完成了xml文件的解析部分,现在我不知道如何开始第一次修改。
谢谢您的指导。

在“寄存器”下创建2个子元素并删除不需要的元素“重置”的代码

import xml.etree.ElementTree as ET


xml = '''<component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009/index.xsd">
  <memoryMaps>
    <memoryMap>
      <name>name</name>
      <description>description</description>
      <peripheral>
        <name>periph</name>
        <description>description</description>
        <baseAddress>0x0</baseAddress>
        <range>0x8</range>
        <width>32</width>
        <register>
          <name>reg1</name>
          <displayName>reg1</displayName>
          <addressOffset>0x0</addressOffset>
          <size>32</size>
          <access>read-write</access>
          <reset>
            <value>0x00000002</value>
            <mask>0xFFFFFFFF</mask>
          </reset>
          <field>
            
          </field>
          </register>
      </peripheral>
    </memoryMap>
  </memoryMaps>
</component>'''

root = ET.fromstring(xml)
register = root.find('.//register')
value = register.find('.//reset/value').text
mask = register.find('.//reset/mask').text

v = ET.SubElement(register, 'resetValue')
v.text = value
m = ET.SubElement(register, 'resetMask')
m.text = mask
register.remove(register.find('reset'))

ET.dump(root)
将xml.etree.ElementTree作为ET导入
xml=“”
名称
描述
外围
描述
0x0
0x8
32
reg1
reg1
0x0
32
读写
0x00000002
0xFFFFFF
'''
root=ET.fromstring(xml)
register=root.find('.//寄存器')
value=register.find('.//reset/value')。text
mask=register.find('.//reset/mask').text
v=ET.SubElement(寄存器“resetValue”)
v、 文本=值
m=ET.SubElement(寄存器“重置掩码”)
m、 文本=掩码
register.remove(register.find('reset'))
ET.dump(根目录)
输出

<?xml version="1.0" encoding="UTF-8"?>
<component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009/index.xsd">
   <memoryMaps>
      <memoryMap>
         <name>name</name>
         <description>description</description>
         <peripheral>
            <name>periph</name>
            <description>description</description>
            <baseAddress>0x0</baseAddress>
            <range>0x8</range>
            <width>32</width>
            <register>
               <name>reg1</name>
               <displayName>reg1</displayName>
               <addressOffset>0x0</addressOffset>
               <size>32</size>
               <access>read-write</access>
               <field />
               <resetValue>0x00000002</resetValue>
               <resetMask>0xFFFFFFFF</resetMask>
            </register>
         </peripheral>
      </memoryMap>
   </memoryMaps>
</component>

名称
描述
外围
描述
0x0
0x8
32
reg1
reg1
0x0
32
读写
0x00000002
0xFFFFFF

再次感谢您。我唯一的修改是将“root=ET.fromstring(xml)”替换为“root=tree.getroot()”,以简化解析。还有一个问题是,它总是将新创建的子元素放在节点“register”的末尾,而不是“field”元素之前的特定位置,如图所示!也许我可以看看up@lmen-新元素的位置不重要,应忽略。