изменить узел и извлечь данные из XML-файла в python

#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/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>
  

Я хочу внести некоторые изменения, чтобы изменить узел «reset», чтобы он стал 2 отдельными узлами, один для «resetValue», а другой «resetMask», но сохраняя те же данные в «value» и «mask», извлеченных в «resetValue» и «resetMask», как показано ниже:

           ........
          <access>read-write</access>
          <resetValue>0x00000002</resetValue>
          <resetMask>0xFFFFFFFF</resetMask>
          <field>
           .............
  

Я успешно справился с частью синтаксического анализа моего XML-файла, теперь я не могу знать, как начать эту первую модификацию.
Спасибо, что помогли мне.

Ответ №1:

код, который создает 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 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>
  

Комментарии:

1. Еще раз спасибо. Единственная модификация, которую я заменил «root = ET.fromstring (xml)» на «root = tree.getroot ()», чтобы упростить синтаксический анализ. Одна из проблем по-прежнему заключается в том, что он всегда помещает новые созданные подэлементы в конец узла «register» вместо определенного местоположения перед элементом «field», как указано выше! Может быть, я могу это посмотреть

2. @lmen — расположение новых элементов не имеет значения и должно игнорироваться.