这条线上有两个问题:
a=tree.find('parent')
First, <parent>
不是根元素的直接子元素。<parent>
是根元素的孙元素。到父级的路径看起来像/project/grandparent/parent
。要搜索<parent>
,尝试 XPath 表达式*/parent
或者可能//parent
.
Second, <parent>
存在于默认命名空间中,因此您将无法.find()
它只有一个简单的名字。您需要添加命名空间。
这是两个同样有效的调用tree.find()
,每个都应该找到<parent>
node:
a=tree.find('*/{http://maven.apache.org/POM/4.0.0}parent')
a=tree.find('*/xmlns:parent', namespaces=spaces)
接下来,调用findall()
需要命名空间限定符:
for b in a.findall('xmlns:child', namespaces=spaces)
第四,创建新子元素的调用需要命名空间限定符。可能有一种方法可以使用快捷方式名称,但我找不到。我不得不使用名字的长形式。
ET.SubElement(a,'{http://maven.apache.org/POM/4.0.0}child').text="Jay/Doctor"
最后,除非您提供默认命名空间,否则您的 XML 输出将看起来很难看:
tree.write('test.xml', default_namespace=spaces['xmlns'])
与 XML 方面无关,您错误地复制了我上一个问题的答案。这else
与for
,不与if
:
for ...
if ...
else ...