首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用命名空间遍历元素树

如何使用命名空间遍历元素树
EN

Stack Overflow用户
提问于 2018-10-04 19:37:43
回答 1查看 1.2K关注 0票数 0

我一直试图使用python中的ElementTree来解析一个xml文档,以修改其中一个元素,但是由于名称空间,我一直遇到问题。

我可以从我的xml文档中获取所有标记

代码语言:javascript
复制
data = open('query-user-by-name.xml').read()
root = ET.fromstring(data)
for item in root.iter():
    print(item.tag)

这给了我:

代码语言:javascript
复制
{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

我创建了一个具有命名空间的字典:

代码语言:javascript
复制
namespaces = {'ns':'http://prism.evolveum.com/xml/ns/public/query-3'}

但是当我试图找到我正在寻找的元素时

代码语言:javascript
复制
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个给定)

我似乎只提出了两个论点,而不是三个论点。如果使用命名空间正确地迭代这些元素,我做了什么错事?

*编辑:这是我的QueryAllusers.xml文件:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-04 19:51:48

正如@gill Hamilton所建议的那样,您应该使用iterfind,但是应该使用XPath表达式,例如:".//ns:value“。

下面是一个完整的例子:

代码语言:javascript
复制
import xml.etree.ElementTree as ET

content = u"""\
<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>"""

root = ET.fromstring(content)

NS = {'ns': 'http://prism.evolveum.com/xml/ns/public/query-3'}

for item in root.iterfind(".//ns:value", NS):
    print(item.tag)

# -> {http://prism.evolveum.com/xml/ns/public/query-3}value
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52653985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档