使用python在xml文件中使用循环修改元素文本
我一直在使用python、lxml库和ElementTree对.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>
<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>