使用python替换xml标记内容

时间:2015-10-13 09:47:28

标签: python regex xml lxml

我有一个包含一些数据的xml文件。

<Emp>
<Name>Raja</Name>
<Location>
     <city>ABC</city>
     <geocode>123</geocode>
     <state>XYZ</state> 
</Location>
<sal>100</sal>
<type>temp</type> 
</Emp>

因此xml文件中的位置信息有误,我必须替换它。

我在python中构建了带有更正的vales的位置信息。

variable = '''
    <Location isupdated=1>
         <city>MyCity</city>
         <geocode>10.12</geocode>
         <state>MyState</state> 
    </Location>'''

因此,应使用新信息替换位置标记。有没有简单的方法在python中更新它。

我想要最终的结果数据,如

<Emp>
<Name>Raja</Name>
<Location isupdated=1>
         <city>MyCity</city>
         <geocode>10.12</geocode>
         <state>MyState</state>
</Location>
<sal>100</sal>
<type>temp</type> 
</Emp>

有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:2)

更新 - XML PARSER实现:因为替换特定的<Location>标记需要修改正则表达式,以提供基于ElementTree解析器的更通用和更安全的替代实现(如上述@stribizhev和@Saket Mittal表示。

我要添加根元素<Emps>(制作有效的xml文档,需要根元素),我也选择过滤要编辑的位置{{1} } tag(但可能是everyfield):

<city>

代码的在线可运行版本here

以前的注册实施

这是一个使用延迟修饰符#!/usr/bin/python # Alternative Implementation with ElementTree XML Parser xml = '''\ <Emps> <Emp> <Name>Raja</Name> <Location> <city>ABC</city> <geocode>123</geocode> <state>XYZ</state> </Location> <sal>100</sal> <type>temp</type> </Emp> <Emp> <Name>GsusRecovery</Name> <Location> <city>Torino</city> <geocode>456</geocode> <state>UVW</state> </Location> <sal>120</sal> <type>perm</type> </Emp> </Emps> ''' from xml.etree import ElementTree as ET # tree = ET.parse('input.xml') # decomment to parse xml from file tree = ET.ElementTree(ET.fromstring(xml)) root = tree.getroot() for location in root.iter('Location'): if location.find('city').text == 'Torino': location.set("isupdated", "1") location.find('city').text = 'MyCity' location.find('geocode').text = '10.12' location.find('state').text = 'MyState' print ET.tostring(root, encoding='utf8', method='xml') # tree.write('output.xml') # decomment if you want to write to file 和全部.*?点的可能实现:

(?s)

您可以在线测试代码here

警告:如果xml输入中有多个#!/usr/bin/python import re xml = '''\ <Emp> <Name>Raja</Name> <Location> <city>ABC</city> <geocode>123</geocode> <state>XYZ</state> </Location> </Emp>''' locUpdate = '''\ <Location isupdated=1> <city>MyCity</city> <geocode>10.12</geocode> <state>MyState</state> </Location>''' output = re.sub(r"(?s)<Location>.*?</Location>", r"%s" % locUpdate, xml) print output 标记,则正则表达式会将所有标记替换为<Location>。你必须使用:

locUpdate