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

Posted

技术标签:

【中文标题】使用 Python 在 XML 中查找和替换值【英文标题】:Find and Replace Values in XML using Python 【发布时间】:2011-09-25 07:37:06 【问题描述】:

我正在寻找使用 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>

【问题讨论】:

+1 到 xml 解析器。我喜欢lxml。 easy_install lxml 感谢您的回复。我对 python 很陌生,对 XML 很陌生,这是我在 Stack 上的第一篇文章。有时提出正确的问题比找到正确的答案更困难。 您还想熟悉一下 xpath,它是一种用于 XML 的查询语言。不用担心,您可以在 SO 上获得大量帮助。 【参考方案1】:

如果您只想替换% 所包含的位,那么这并不是真正的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)

【讨论】:

我在一个独立的脚本中对此进行了测试,效果很好。我将把它添加到我的 python 库中以供将来参考。感谢您的回复。【参考方案2】:

要替换占位符,您只需逐行读取文件并替换:

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

【讨论】:

这可能很脆弱 - XML 文件不仅仅是文本。空格在 XML 中通常不重要,因此对输入文件的更改可能会导致您的代码无法识别相同的 XML。 %something% 占位符中没有空格,如果需要,我只会添加编码特殊的 XML 字符,尤其是 我想我只是不明白当 XML 节点的值未知时这个解决方案是如何工作的。 只要 'uknown' 未被用作有效占位符,它将保持原样。它只是一个字符串。【参考方案3】:

基础知识:

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 支持定位节点。

【讨论】:

嘿,谢谢马克。这正是我一直在寻找的。这适用于我现有的 python 程序。【参考方案4】:

您可以使用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']

【讨论】:

以上是关于使用 Python 在 XML 中查找和替换值的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL:在 xml 中查找标签值并将其替换为标签名称以创建示例数据

从 xml 属性中查找并执行数学表达式并替换值

替换VB6中的XML节点中的值

VS代码查找xml属性并替换为当前值*因子

使用 XQuery 仅查找和替换 xml 值的一部分?

Python - LibreOffice Calc - 使用正则表达式查找和替换