python xml.etree.ElementTree 根据文本子元素添加子元素或父元素

python xml.etree.ElementTree add subelement to parent based on subelement text

我有以下示例 xml 文件:

<root>
 <input_file>
   <type>x</type>
 </input_file>
 <input_file>
   <type>y</type>
 </input_file>
</root>

并想使用 python xml.etree.ElementTree 添加基于 <type> 标签的子元素。示例:

将带有文本 'z' 的 <path></path> 标签添加到 <type>x</type>,例如:

<root>
 <input_file>
   <type>x</type>
   <path>z</path>
 </input_file>
 <input_file>
   <type>y</type>
 </input_file>
</root>

这是我对 python 代码的尝试:

import xml.etree.ElementTree as ET

xml_file = 'test.xml'

tree = ET.parse(xml_file)
root = tree.getroot()

for input_file in root.findall('input_file'):

    type_element = input_file.find('type')

    if type_element.text == 'x':

        c = ET.SubElement(input_file, 'path')

        c.text('z')
        
print (ET.tostring(root))

我收到类型错误:

c.text('z')
TypeError: 'NoneType' object is not callable

我知道如果类型是属性而不是子标签会更容易(即 <input_file type='x'></input_file>

但事实并非如此

是否需要先发起亲子关系?

谢谢。

在这个实例中,c.text不是一个方法,它是一个实例变量。您可以对照 help(c) 的输出检查它。将方法调用更改为赋值语句。

     |  Data descriptors defined here:
     |  
     |  attrib
     |      A dictionary containing the element's attributes
     |  
     |  tag
     |      A string identifying what kind of data this element repre
sents
     |  
     |  tail
     |      A string of text directly after the end tag, or None
     |  
     |  text
     |      A string of text directly after the start tag, or None
c.text = "z"

或者您可以在对 c.__init__

的调用中分配 c.text
c = ET.SubElement(input_file, 'path', text="z")

https://docs.python.org/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element