如何使用python更新xml标记值?

时间:2015-10-07 15:46:45

标签: python xml xml-parsing parse-tree xml.etree

我是Python的新手,我想知道如何使用python实现以下功能。

我有一个XML文件,我想打开该文件,并且必须为标记设置新值。

如果在更新期间出现任何故障,则文件将进入原始状态

FileName:ABC.xml

<Root>
<Location>
<city>WrongCity</city>
<state>WrongState</state>
<country>WrongCountry</country>
</Location>
</Root>

将文件路径传递给某个函数。

def correctValues(filepath)
    # update the wrong information 
    try:
        set city = MYcity
        set state = somevalue
        set country = somedata
    except:
        Rollback to original file

如果值更新期间没有问题,则原始文件需要使用更正的值更新。

预期产出:

<Root>
<Location>
<city>MYcity</city>
<state>somevalue</state>
<country>somedata</country>
</Location>
</Root>

如果出现任何问题,该文件应该回滚。

提前致谢。

1 个答案:

答案 0 :(得分:0)

最简单的方法可能是:

  1. 调用库将XML解析为实际的节点树;

  2. 修改那棵树然后你需要;以及

  3. 将新树写回。

  4. 使用&#34; bs4&#34; (它有一些问题,但通常就足够了),它看起来像是:

    from bs4 import BeautifulSoup as BS
    import codecs
    
    badCityDict = {  # List of corrections
        "Washingtun": "Washington",
        "Bolton": "Boston"
    }
    
    # Second parameter to constructor picks what parser bs4 should use.
    tree = bs4(codecs.open(myfile, mode='r', encoding='utf-8'), 'lxml')
    
    changeCount = 0
    cityNodes = tree.find_all('city')
    for cn in cityNodes:
        cnText = cn.string.strip()
        if cnText in badCityDict:
            cn.string.replace_with(badCityDict[cnText])
            changeCount += 1
    
    ### same thing for state, country, and so on...
    
    if (changeCount > 0):
        print tree.prettify()