如何解决如何使用python查找和更新XML文件内容
例如
<managedObject class="New" distName="MB-85404/TB-85404/ST-4/a" version="xL20A_1911_002" operation="open">
<p name="a">320ms</p>
<p name="b">enabled</p>
<p name="c">640ms</p>
<p name="d">320ms</p>
<p name="e">640ms</p>
<p name="f">1280ms</p>
<p name="g">6</p>
</managedObject>
<managedObject class="new" distName="AL-76867/MB-85404/TB-85404/ST-4/b" version="xL20A_1911_002" operation="open">
<p name="h">320ms</p>
<p name="i">enabled</p>
<p name="j">640ms</p>
<p name="k">320ms</p>
<p name="l">640ms</p>
<p name="a">1280ms</p>
<p name="l">6</p>
</managedObject>
<managedObject class="New" distName="MB-85404/TB-85404/ST-4/c" version="xL20A_1911_002" operation="open">
<p name="a">320ms</p>
<p name="p">enabled</p>
<p name="q">640ms</p>
<p name="r">320ms</p>
<p name="s">640ms</p>
<p name="t">1280ms</p>
<p name="u">6</p>
</managedObject>
在此示例中,我首先要将(distName="MB-85404/TB-85404/ST-4/[a or b or c]")
更新为(distName="MB-85409/TB-85409/ST-4/[a or b or c]")
对整个XML文件执行此操作之后。
执行完此操作后,我想更新标签name="a"
的值<managedObject class="New" distName="MB-85409/TB-85409/ST-4/[a or b or c] >
如何执行此操作,我有一个40000多行的XML文件。
EDIT1
with open("C:/files/abcd.xml","w+") as file:
xml_data = file.read()
xml_data.replace("85409","85904")
file.write("outPuta.xml")
EDIT2
soup = bs(content,"xml")
loc = re.compile(r'[A-Z]+-+[0-9]+/+SMOD+-+[1-9]')
for i in soup.find_all('managedObject',distName=loc):
locat=i.find('p',{'name':'moduleLocation'})
locat.string="3444 South texas"
通过此代码,我试图找到与distname
匹配的regex loc
,并且在managedObject
内,我试图找到标签<p name="moduleLocation" 4444 New York>
,并且我想更新{{1 }}到"4444 New York"
,这给了我下面提到的错误
"3444 South texas"
解决方法
希望我能正确理解您的问题,这将找到所有distName="MB-85404/TB-85404/ST-4/[a or b or c]"
标签并将85404
替换为85409
,并更新<p name="a">
标签:
import re
from bs4 import BeautifulSoup
xml_data = ''' <managedObject class="New" distName="MB-85404/TB-85404/ST-4/a" version="xL20A_1911_002" operation="open">
<p name="a">320ms</p>
<p name="b">enabled</p>
<p name="c">640ms</p>
<p name="d">320ms</p>
<p name="e">640ms</p>
<p name="f">1280ms</p>
<p name="g">6</p>
</managedObject>
<managedObject class="new" distName="AL-76867/MB-85404/TB-85404/ST-4/b" version="xL20A_1911_002" operation="open">
<p name="h">320ms</p>
<p name="i">enabled</p>
<p name="j">640ms</p>
<p name="k">320ms</p>
<p name="l">640ms</p>
<p name="a">1280ms</p>
<p name="l">6</p>
</managedObject>
<managedObject class="New" distName="MB-85404/TB-85404/ST-4/c" version="xL20A_1911_002" operation="open">
<p name="a">320ms</p>
<p name="p">enabled</p>
<p name="q">640ms</p>
<p name="r">320ms</p>
<p name="s">640ms</p>
<p name="t">1280ms</p>
<p name="u">6</p>
</managedObject>'''
soup = BeautifulSoup('<data>' + xml_data + '</data>','xml')
r = re.compile(r'^MB-85404/TB-85404/ST-4/(?:a|b|c)')
for o in soup.find_all('managedObject',distName=r):
o['distName'] = o['distName'].replace('85404','85409')
p = o.find('p',{'name':'a'})
p.string = 'UPDATED ' + p.string
soup.data.unwrap()
print(soup)
打印:
<?xml version="1.0" encoding="utf-8"?>
<managedObject class="New" distName="MB-85409/TB-85409/ST-4/a" operation="open" version="xL20A_1911_002">
<p name="a">UPDATED 320ms</p>
<p name="b">enabled</p>
<p name="c">640ms</p>
<p name="d">320ms</p>
<p name="e">640ms</p>
<p name="f">1280ms</p>
<p name="g">6</p>
</managedObject>
<managedObject class="new" distName="AL-76867/MB-85404/TB-85404/ST-4/b" operation="open" version="xL20A_1911_002">
<p name="h">320ms</p>
<p name="i">enabled</p>
<p name="j">640ms</p>
<p name="k">320ms</p>
<p name="l">640ms</p>
<p name="a">1280ms</p>
<p name="l">6</p>
</managedObject>
<managedObject class="New" distName="MB-85409/TB-85409/ST-4/c" operation="open" version="xL20A_1911_002">
<p name="a">UPDATED 320ms</p>
<p name="p">enabled</p>
<p name="q">640ms</p>
<p name="r">320ms</p>
<p name="s">640ms</p>
<p name="t">1280ms</p>
<p name="u">6</p>
</managedObject>
编辑:要将每个85404
中的85409
更改为distName=
,您可以这样做:
for o in soup.find_all('managedObject',{'distName': True}):
o['distName'] = o['distName'].replace('85404','85409')
EDIT2:要替换整个文件,
with open("C:/files/abcd.xml","r") as f_in:
xml_data = f_in.read()
with open("C:/files/output.xml","w") as f_out:
f_out.write(xml_data.replace("85409","85904"))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。