使用 Python 编辑 XML 文件中的文本字段

在 Python 中,可以使用 xml.etree.ElementTree 模块来读取和编辑 XML 文件。下面是一个例子,演示如何编辑 XML 文件中的文本字段并保存更改。

1、问题背景

我有一个包含一些数据的 XML 文件,如下所示:

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?> 
- <ParameterData>
  <CreationInfo date="10/28/2009 03:05:14 PM" user="manoj" /> 
- <ParameterList count="85">
- <Parameter name="Spec 2 Included" type="boolean" mode="both">
  <Value>n/a</Value> 
  <Result>n/a</Result> 
  </Parameter>
- <Parameter name="Spec 2 Label" type="string" mode="both">
  <Value>n/a</Value> 
  <Result>n/a</Result> 
  </Parameter>
- <Parameter name="Spec 3 Included" type="boolean" mode="both">
  <Value>n/a</Value> 
  <Result>n/a</Result> 
  </Parameter>
- <Parameter name="Spec 3 Label" type="string" mode="both">
  <Value>n/a</Value> 
  <Result>n/a</Result> 
  </Parameter>
  </ParameterList>
  </ParameterData>

我还有一份以分行形式存储键值对的文本文件,如下所示:

text 复制代码
Spec 2 Included : TRUE
Spec 2 Label: 19-Flat2-HS3   
Spec 3 Included : FALSE
Spec 3 Label: 4-1-Bead1-HS3

我想使用 Python 将 XML 文件中的字段值(n/a)替换为文本文件中的相应值,使 XML 文件看起来像这样:

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?> 
- <ParameterData>
  <CreationInfo date="10/28/2009 03:05:14 PM" user="manoj" /> 
- <ParameterList count="85">
- <Parameter name="Spec 2 Included" type="boolean" mode="both">
  <Value>TRUE</Value> 
  <Result>TRUE</Result> 
  </Parameter>
- <Parameter name="Spec 2 Label" type="string" mode="both">
  <Value>19-Flat2-HS3</Value> 
  <Result>19-Flat2-HS3</Result> 
  </Parameter>
- <Parameter name="Spec 3 Included" type="boolean" mode="both">
  <Value>FALSE</Value> 
  <Result>FALSE</Result> 
  </Parameter>
- <Parameter name="Spec 3 Label" type="string" mode="both">
  <Value>4-1-Bead1-HS3</Value> 
  <Result>4-1-Bead1-HS3</Result> 
  </Parameter>
  </ParameterList>
  </ParameterData>

2、解决方案

以下是用 Python 实现的解决方案:

python 复制代码
import xml.etree.ElementTree as ET
import re

# 解析 XML 文件
tree = ET.parse('input.xml')
root = tree.getroot()

# 读取文本文件中的键值对
with open('values.txt', 'r') as f:
    values = dict(re.findall('(Spec \d+ (?:Included|Label))\s*:\s*(\S+)', f.read()))

# 修改 XML 文件中的字段值
for parameter in root.findall('ParameterList/Parameter'):
    name = parameter.get('name')
    if name in values:
        parameter.find('Value').text = values[name]
        parameter.find('Result').text = values[name]

# 保存修改后的 XML 文件
tree.write('output.xml')

这个解决方案使用 ElementTree 库来解析 XML 文件,并使用正则表达式来读取文本文件中的键值对。然后,它迭代 XML 文件中的 Parameter 元素,并使用 values 字典来查找每个 Parameter 的新值。最后,它将修改后的 XML 文件写入一个新的文件中。

以下是一些可以使用的代码示例:

python 复制代码
# 读取 XML 文件并创建一个 ElementTree 对象
tree = ET.parse('input.xml')

# 获取根元素
root = tree.getroot()

# 找到所有名为 'Parameter' 的子元素
parameters = root.findall('ParameterList/Parameter')

# 遍历 'Parameter' 元素并打印它们的 'name' 和 'Value' 属性
for parameter in parameters:
    print(parameter.get('name'), parameter.find('Value').text)

这个代码示例将从 input.xml 文件中读取所有名为 'Parameter' 的元素,并打印它们的 'name' 和 'Value' 属性。

python 复制代码
# 创建一个新的 ElementTree 对象并添加一个根元素
tree = ET.ElementTree()
root = ET.Element('root')
tree._setroot(root)

# 向根元素添加一个子元素
child = ET.SubElement(root, 'child')

# 设置子元素的 'name' 和 'value' 属性
child.set('name', 'my_name')
child.text = 'my_value'

# 将 ElementTree 对象保存到一个 XML 文件
tree.write('output.xml')

这个代码示例将创建一个新的 ElementTree 对象,并添加一个根元素。然后,它向根元素添加一个子元素,并设置子元素的 'name' 和 'value' 属性。最后,它将 ElementTree 对象保存到一个 XML 文件中。

注意事项

  • 保存编码tree.write()encoding="utf-8" 参数指定保存的文件编码为 UTF-8,这在处理非 ASCII 字符时很重要。
  • 备份文件:在编辑 XML 文件前,建议先备份文件,以防修改错误。

这样,你可以轻松地编辑 XML 文件中的文本字段并保存更改。

相关推荐
C++业余爱好者几秒前
JVM优化入门指南:JVM垃圾收集器(GC)介绍
java·开发语言·jvm
dhdjjsjs3 分钟前
Day34 PythonStudy
python
云和恩墨4 分钟前
MySQL和PostgreSQL谁更适合AI时代?
数据库
Trouvaille ~6 分钟前
【Java篇】基石与蓝图::Object 类与抽象类的双重奏
java·开发语言·javase·抽象类·类与对象·基础入门·object类
数据猿7 分钟前
【金猿人物展】涛思数据创始人、CEO陶建辉:实现AI时代时序数据库向“数据平台”的转型
大数据·数据库·人工智能·时序数据库·涛思数据
当代红领巾8 分钟前
Oracle 表空间扩容
数据库·oracle
小光学长10 分钟前
基于ssm的美妆产品推荐系统rah0h134(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring
_果果然12 分钟前
数据库、表、字段:理解MySQL的三层结构
数据库·mysql
Leon-Ning Liu12 分钟前
Oracle 19c RAC ASM 密码文件恢复方方案二:基于密码文件备份还原
数据库·oracle
间彧17 分钟前
TiDB详解与应用实战:分布式数据库的核心原理与最佳实践
数据库