如何使用 xml.etree.ElementTree 在 xml 文件上添加子项

How to add a subchild on a xml file using xml.etree.ElementTree

我正在关注 official documentation 关于如何修改现有 xml 文件以便在记录子项中添加子项值。

原始xml文件:

<Values version="2.0">
  <value name="system_type">osx</value>
  <record name="service">
    <value name="threads">1</value>
  </record>
</Values>

当前代码:

from xml.etree import ElementTree as ET

tree = ET.parse('data.xml')


values = tree.getroot()
list_languages = values.getchildren()

processing = ET.Element('value')
processing.attrib['name'] = 'cpu_use_limit'
processing.text = '20'

values.append(processing)

tree.write('output.xml')

当前输出:

<Values version="2.0">
      <value name="system_type">osx</value>
      <record  name="service">
        <value name="threads">1</value>
      </record>
      <value name="cpu_use_limit">20</value>
</Values>

需要xml文件:

<Values version="2.0">
      <value name="system_type">osx</value>
      <record  name="service">
        <value name="threads">1</value>
        <value name="cpu_use_limit">20</value>
      </record>  
</Values>

我想从一个评论开始:输入 XML 似乎是错误的(语义上),因为你有一个根节点 Values,其中有 children value and record(没有似乎属于这里)。

但是,考虑到XML是正确的,那么就不要直接在Values[=下添加新创建的节点了34=] 节点,但在 record 下(这是 Values 的 child)。要找出该节点,使用 [Python 3]: findall(match, namespaces=None)

code.py:

from xml.etree import ElementTree as ET


if __name__ == "__main__":
    tree = ET.parse("data.xml")

    values = tree.getroot()
    list_languages = values.getchildren()

    processing = ET.Element("value")
    processing.attrib["name"] = "cpu_use_limit"
    processing.text = "20"

    relevant_nodes = values.findall("record")
    for relevant_node in relevant_nodes:
        relevant_node.append(processing)

    tree.write("output.xml", encoding="utf-8", xml_declaration=True)

运行代码后,

output.xml:

<?xml version='1.0' encoding='utf-8'?>
<Values version="2.0">
  <value name="system_type">osx</value>
  <record name="service">
    <value name="threads">1</value>
  <value name="cpu_use_limit">20</value></record>
</Values>