使用Python在XML中查找和替换值

时间:2011-06-29 16:18:35

标签: python xml replace find

我希望使用python编辑XML文件。我想找到并替换标签中的关键字。过去,同事已经设置了模板XML文件,并使用“查找和替换”程序来替换这些关键词。我想使用python来查找并用值替换这些关键字。我一直在教自己Elementtree模块,但是我在尝试查找和替换时遇到了麻烦。我附上了一个我的XML文件。您将看到一些由%包围的变量(即%SITEDESCR%)这些是我想要替换的单词,然后将XML保存到新文件中。任何帮助或建议都会很棒。

谢谢, 麦克

<metadata>
<idinfo>
<citation>
<citeinfo>
 <origin>My Company</origin>
 <pubdate>05/04/2009</pubdate>
 <title>POLYGONS</title>
 <geoform>vector digital data</geoform>
 <onlink>\\C$\ArcGISDevelopment\Geodatabase\PDA_STD_05_25_2009.gdb</onlink>
</citeinfo>
</citation>
 <descript>
 <abstract>This dataset represents the mapped polygons developed from the field data for the %SITEDESCR%.</abstract>
 <purpose>This dataset was created to accompany some stuff.</purpose>
 </descript>
<timeperd>
<timeinfo>
<rngdates>
 <begdate>%begdate%</begdate>
 <begtime>unknown</begtime>
 <enddate>%enddate%</enddate>
 <endtime>unknown</endtime>
 </rngdates>
 </timeinfo>
 <current>ground condition</current>
 </timeperd>

5 个答案:

答案 0 :(得分:43)

基础知识:

from xml.etree import ElementTree as et
tree = et.parse(datafile)
tree.find('idinfo/timeperd/timeinfo/rngdates/begdate').text = '1/1/2011'
tree.find('idinfo/timeperd/timeinfo/rngdates/enddate').text = '1/1/2011'
tree.write(datafile)

如果标签名称是唯一的,您可以缩短路径。此语法在树中的任何深度级别查找第一个节点。

tree.find('.//begdate').text = '1/1/2011'
tree.find('.//enddate').text = '1/1/2011'

另外,请阅读documentation,尤其是XPath支持定位节点。

答案 1 :(得分:5)

如果您只想替换%附带的位,那么这实际上不是XML问题。您可以使用正则表达式轻松完成:

import re
xmlstring = open('myxmldocument.xml', 'r').read()
substitutions = {'SITEDESCR': 'myvalue', ...}
pattern = re.compile(r'%([^%]+)%')
xmlstring = re.sub(pattern, lambda m: substitutions[m.group(1)], xmlstring)

答案 2 :(得分:1)

Juste逐行读取文件并替换:

for line in open(template_file_name,'r'):
  output_line = line
  output_line = string.replace(output_line, placeholder, value)
  print output_line 

答案 3 :(得分:0)

您可以就地修改并安全地使用 xpath 而不是完整路径或更糟的正则表达式。请参阅下文并查看 etree

上的文档
from lxml import etree
raw = """
<node>
<begdate>%begdate%</begdate>
<begtime>unknown</begtime>
<enddate>%enddate%</enddate>
<endtime>unknown</endtime>
</node>"""
nodes = etree.fromstring(raw.strip())
shh = [setattr(x, "text", "DATE: 2021-01-01") for x in nodes.xpath(".//*[.='%begdate%']")]
nodes.xpath(".//begdate//text()")
['DATE: 2021-01-01']

答案 4 :(得分:-1)

您可以使用此 modify_xml 函数。 模式将是您要添加一些值的标签,并在 value 中输入要为其提供的值。 此功能将在标记后添加。如果标记为空,并且您想为其分配一些,则此方法更好。如果要替换一个已经存在的值,则还可以通过以下操作来实现:首先使用regex删除标记之间的值,然后使用此 modify_xml 函数。

import fileinput,re  

def  modify_xml(file_name,pattern,value=""):  
    f=fileinput.input(file_name,inplace=True)  
    for line in f:  
        replacement=line+value 
        line=re.sub(pattern,replacement,line)  
        sys.stdout.write(line)  
    f.close()