Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python在xml文件中使用循环修改元素文本_Python_Xml_Lxml - Fatal编程技术网

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

使用python在xml文件中使用循环修改元素文本,python,xml,lxml,Python,Xml,Lxml,我一直在使用python、lxml库和ElementTree对.xml文件进行一些修改。我有一个结果: <component xmlns:xsi="http://www.w3.orgr"> <memoryMaps> <memoryMap> <name>name</name> <description>description</description>

我一直在使用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>
这似乎只正确地替换了最后一个寄存器,其余寄存器的显示名称错误。我知道我的循环有问题也许

请指教 谢谢大家!

从lxml导入etree
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') )
root=etree.parse(r“”) 对于root.xpath(“//name[./以下同级::displayName]”中的名称: name.getnext().text=name.text 打印(etree.tostring(root,pretty\u print=True)。解码('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>

名称
描述
外围
描述
0x0
0x8
32
reg1
reg1
....
reg2
reg2
.................
条例3
条例3
..................

向您推荐一个简单的库

from simplified_scrapy import SimplifiedDoc, utils
# xml = utils.getFileContent('your xml path')
xml = '''
        <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>
'''
doc = SimplifiedDoc(xml)  # create doc
registers = doc.selects('register')

for r in registers:
    r.displayName.setContent(r.name.html)

# Or
names = doc.selects('register>name')

for n in names:
    n.setContent(n.next.html)

    # Or
    # n.setContent(n.getNext('displayName').html)

print(doc.html)
从simplified\u scrapy导入SimplifiedDoc,utils
#xml=utils.getFileContent('您的xml路径')
xml=“”
reg1
1.
....
reg2
1.
.................
条例3
1.
..................
'''
doc=SimplifiedDoc(xml)#创建文档
寄存器=文件选择('寄存器')
对于寄存器中的r:
r、 setContent(r.name.html)
#或
名称=文件选择('寄存器>名称')
对于名称中的n:
n、 setContent(n.next.html)
#或
#n.setContent(n.getNext('displayName').html)
打印(doc.html)
结果:

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

reg1
reg1
....
reg2
reg2
.................
条例3
条例3
..................

还有更多的例子。此库易于使用。

您是否可以使用此方法为我提供更多参考或链接,就像“跟随兄弟”之前引用元素的相反方式一样?这似乎很有趣@我知道这是xpath——网上有很多教程,但我觉得这本很有用(因为我已经知道CSS)
from simplified_scrapy import SimplifiedDoc, utils
# xml = utils.getFileContent('your xml path')
xml = '''
        <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>
'''
doc = SimplifiedDoc(xml)  # create doc
registers = doc.selects('register')

for r in registers:
    r.displayName.setContent(r.name.html)

# Or
names = doc.selects('register>name')

for n in names:
    n.setContent(n.next.html)

    # Or
    # n.setContent(n.getNext('displayName').html)

print(doc.html)
    <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>