【问题标题】:How to find and update XML file content using python如何使用 python 查找和更新 XML 文件内容
【发布时间】:2020-08-12 16:03:46
【问题描述】:

例如

 <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" 的值&lt;managedObject class="New" distName="MB-85409/TB-85409/ST-4/[a or b or c] &gt;

我该怎么做呢,我有一个超过 40000 行的 XML 文件。

编辑1

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"

通过此代码,我试图找到与regex loc 匹配的distname,在managedObject 内部,我试图找到标签&lt;p name="moduleLocation" 4444 New York&gt;,我想将"4444 New York" 更新为"3444 South texas",这是给我在下面提到了错误

locat.string="3444 South texas"
AttributeError: 'NoneType' object has no attribute 'string'

【问题讨论】:

    标签: python-3.x xml beautifulsoup elementtree


    【解决方案1】:

    我希望我正确理解了您的问题,这将找到所有distName="MB-85404/TB-85404/ST-4/[a or b or c]" 标签并将85404 替换为85409 并更新&lt;p name="a"&gt; 标签:

    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>
    

    编辑:要将每个distName= 中的85404 更改为85409,您可以这样做:

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

    【讨论】:

    • 谢谢 Andrej 我会试试的,我只是有点怀疑当你更新 p 标签时

      是否会在任何时候更新整个 XML 文件 出现或当 managedObject 匹配时它会更新

      @AkashRathor 它将仅在 &lt;managedObject&gt; 内部更新 &lt;p name="a"&gt;distName="MB-85404/TB-85404/ST-4/[a or b or c]"

    • 如果我想在整个 XML 文件上将“85404”更新为“85409”,无论其位置如何,我该怎么做?抱歉,我问了太多问题,我是新手这个。
    • 没关系,我们可以在 distName 中更改它,但我想知道我们可以像在记事本中那样在整个工作表中更改它吗?查找并替换所有类型的东西?
    • @AkashRathor 然后您可以使用str.replace,例如将XML 读取到变量xml_data,然后执行xml_data = xml_data.replace('85404', '85409') 并将xml_data 保存到新文件。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签