python - 使用python在xml文件中使用循环修改元素文本

标签 python xml lxml

我一直在使用 python 和 lxml 库以及 ElementTree 对 .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>
        <registers>
          <register>
            <name>reg1</name>
            <displayName>1</displayName>
            ....
          </register>                           
          <register>
            <name>reg2</name>
            <displayName>1</displayName>
              .................
           </register>
           <register>
            <name>reg3</name>
            <displayName>1</displayName>
             ..................
           </register>
       </registers>      
      </peripheral>
    </memoryMap>
  </memoryMaps>
</component>

我现在想要的是在每个“寄存器”中具有相同文本的“名称”和“显示名称”(通过复制显示名称中的名称文本),如下所示:

<registers>
      <register>
        <name>reg1</name>
        <displayName>reg1</displayName>
        ....
      </register>                           
      <register>
        <name>reg2</name>
        <displayName>reg2</displayName>
          .................
       </register>
       <register>
        <name>reg3</name>
        <displayName>reg3</displayName>
         ..................
       </register>
   </registers>   

在解析我的文件后,我尝试了这样的代码:

 for register in root.findall('.//register'):  
    tempo = register.find('.//name').text    
    for EL in root.iter('displayName'):
        EL.text = tempo

这似乎只正确替换了最后一个寄存器,其余寄存器的显示名称错误。我知道我的循环可能有问题?

请多多指教 谢谢!

最佳答案

from lxml import etree

root = etree.parse(r'<your file.xml>')

for name in root.xpath('//name[./following-sibling::displayName]'):
    name.getnext().text = name.text

print( etree.tostring(root, pretty_print=True).decode('utf-8') )

打印:

<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>
        <registers>
          <register>
            <name>reg1</name>
            <displayName>reg1</displayName>
            ....
          </register>                           
          <register>
            <name>reg2</name>
            <displayName>reg2</displayName>
              .................
           </register>
           <register>
            <name>reg3</name>
            <displayName>reg3</displayName>
             ..................
           </register>
       </registers>      
      </peripheral>
    </memoryMap>
  </memoryMaps>
</component>

关于python - 使用python在xml文件中使用循环修改元素文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64563217/

相关文章:

python - lxml 解析没有 Schema URL 的 xsd 文件

python - 如何在 python 中解析格式错误的 HTML

python - 如何使用 FastAPI + uvicorn 在工作人员之间共享数据库连接?

python - 使用 python 从文本文件导入矩阵

python - 如何模拟对象方法返回值

Android 风格不起作用

c# - WCF 不反序列化。为什么我的参数是 NULL?

python - 使用 OpenPyXL 导入多个 Excel 文件

java - GWT 中的 servlet 和路径出现错误 503 (Java)

python - 使用三个 xml 模式作为 lxml 中的一个组合模式进行验证?