簡體   English   中英

從 python 中的 xml 文件中刪除子元素

[英]Delete subelement from xml file in python

我開始學習如何使用 python 和 lxml 庫和 ElementTree 在 xml 文件中進行修改。 經過一些工作后,我得到了這個 xml 文件:

<component xmlns:xsi="http://www.w3.orgr">
  <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>
          <description>This is register 1</description>
          <addressOffset>0x0</addressOffset>
          <size>32</size>
          <access>read-write</access>
          <resetValue>0x00000002</resetValue>
          <resetMask>0xFFFFFFFF</resetMask>
         <fields>
           .................
         </fields>
         <resetValue>0x00000002</resetValue>
         <resetMask>0xFFFFFFFF</resetMask>
         <description>This is register 1</description>
        </register>                           
        <register>
              .................
         </register>
         <register>
             ..................
         </register>      
      </peripheral>
    </memoryMap>
  </memoryMaps>
</component>

我在這里所做的是為每個“注冊”節點使用 function ET.SubElement創建了三個新的子元素(“ resetValue ”、“ resetMask ”和“ description ”),后來我使用element.insert將它們復制到上面的新位置,但現在我需要從 register 節點的末尾刪除多余的,讓它看起來像這樣:

<register>
      <name>reg1</name>
      <displayName>reg1</displayName>
      <description>This is register 1</description>
      <addressOffset>0x0</addressOffset>
      <size>32</size>
      <access>read-write</access>
      <resetValue>0x00000002</resetValue>
      <resetMask>0xFFFFFFFF</resetMask>
     <fields>
       .................
     </fields>
  </register>

我知道這可能不是創建子元素的最佳方法,然后將其替換為新的 position 現在嘗試刪除,但是當我查看另一個名為ET.Element的 function 然后插入時,但我很難找到正確的索引 position所以我選擇這種方法。

在這里,我列出了我在此處使用的部分代碼(我從其他元素中提取了我的子元素的文本):

   v =  ET.SubElement(register, 'resetValue')
   v.text = value 
                                                                                                       
   m = ET.SubElement(register, 'resetMask')  
   m.text = mask 
                                                                                                           
   displayName = register.find('.//displayName').text
   d = ET.SubElement(register, 'description')
   d.text = displayName 
                                                                                   
   register.insert(5, v)  
   register.insert(6, m)                                                                             
   register.insert(2, d) 


                                                                                               

(我希望這段代碼部分能解決更多問題)

有人可以告訴我嗎!

有一個XML的解析庫,修改起來不夠專業,但是靈活。 這是一個供您參考的示例。

from simplified_scrapy.spider import SimplifiedDoc
xml = '''
<component xmlns:xsi="http://www.w3.orgr">
  <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>
          <fields>
          .................
          </fields>
        </register>   
      </peripheral>
    </memoryMap>
  </memoryMaps>
</component>
'''
doc = SimplifiedDoc(xml)  # create doc
registers = doc.selects('register')

l = len(registers)
while l > 0:
    l = l - 1
    register = registers[l] # Start at the back. If you modify it from the front and continue to modify it on the basis of changing the structure of the document, the results may not meet the expectations.

    v = doc.createElement('resetValue', str(l))
    m = doc.createElement('resetMask', str(l))
    d = doc.createElement('description', 'This is register '+str(l))

    access = register.access
    access.insertAfter('\n' + ' ' * 10 + m) # Handling line breaks and padding
    access.insertAfter('\n' + ' ' * 10 + v)

    displayName = register.displayName
    displayName.insertAfter('\n' + ' ' * 10 + d)

print(doc.html)

結果:

<component xmlns:xsi="http://www.w3.orgr">
  <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>
          <description>This is register 0</description>
          <addressOffset>0x0</addressOffset>
          <size>32</size>
          <access>read-write</access>
          <resetValue>0</resetValue>
          <resetMask>0</resetMask>
          <fields>
          .................
          </fields>
        </register>   
      </peripheral>
    </memoryMap>
  </memoryMaps>
</component>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM