【发布时间】:2018-10-04 19:37:43
【问题描述】:
我一直在尝试使用 Python 中的 ElementTree 解析 xml 文档以修改其中一个元素,但是由于命名空间,我一直遇到问题。
我可以从我的 xml 文档中获取所有标签
data = open('query-user-by-name.xml').read()
root = ET.fromstring(data)
for item in root.iter():
print(item.tag)
这给了我:
{http://prism.evolveum.com/xml/ns/public/query-3}query
{http://prism.evolveum.com/xml/ns/public/query-3}filter
{http://prism.evolveum.com/xml/ns/public/query-3}equal
{http://prism.evolveum.com/xml/ns/public/query-3}matching
{http://prism.evolveum.com/xml/ns/public/query-3}path
{http://prism.evolveum.com/xml/ns/public/query-3}value
我创建了一个带有命名空间的字典:
namespaces = {'ns':'http://prism.evolveum.com/xml/ns/public/query-3'}
但是当我尝试使用
找到我正在搜索的元素时data = open('query-user-by-name.xml').read()
root = ET.fromstring(data)
for item in root.iter('ns:value', namespaces):
print(item.tag)
我得到错误:
TypeError: iter() 最多接受 2 个参数(给定 3 个)
似乎我只给出了两个论点而不是三个论点。使用命名空间正确遍历这些元素我做错了什么?
*编辑:这是我的 query-all-users.xml 文件:
<query xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns="http://prism.evolveum.com/xml/ns/public/query-3">
<filter>
<equal>
<matching>polyStringNorm</matching>
<path>c:name</path>
<value>lilpotter</value>
</equal>
</filter>
</query>
【问题讨论】:
-
iter()是一个方法,所有方法都默认通过实例引用(通常命名为self)。将消息视为 "iter() takes at most 1 argument + instance reference (2 + instance given)" -
iter被记录为仅采用一个参数(超出实例引用):tagdocs.python.org/3.5/library/… 也许尝试使用iterfind,它采用额外的namespaces参数?
标签: python xml parsing elementtree