这是关于使用ElementTree修改XML的问题
我现在在我的XML中有名称空间,并尝试通过'ElementTree'了解在Python中使用名称空间解析XML的答案,并具有以下内容。
XML文件。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<grandParent>
<parent>
<child>Sam/Astronaut</child>
</parent>
</grandParent>
</project>
查看通过“ ElementTree”在Python中使用名称空间解析XML之后的python代码
import xml.etree.ElementTree as ET
spaces='xmlns':'http://maven.apache.org/POM/4.0.0','schemaLocation':'http://maven.apache.org/xsd/maven-4.0.0.xsd'}
tree = ET.parse("test.xml")
a=tree.find('parent')
for b in a.findall('child', namespaces=spaces):
if b.text.strip()=='Jay/Doctor':
print "child exists"
break
else:
ET.SubElement(a,'child').text="Jay/Doctor"
tree.write("test.xml")
我收到错误:AttributeError:'NoneType'对象没有属性'findall'
这条线上有两个问题:
a=tree.find('parent')
首先,<parent>
不是root元素的直接子代。<parent>
是根元素的孙代。父母的道路看起来像/project/grandparent/parent
。要搜索<parent>
,尝试XPath表达式*/parent
或possiblly //parent
。
其次,它<parent>
存在于默认名称空间中,因此.find()
仅凭其简单名称就无法使用它。您需要添加名称空间。
这是对的两个同样有效的调用tree.find()
,每个调用都应找到该<parent>
节点:
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 ...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句