gpt4 book ai didi

python - 如何在 python 中使用 ElementTree 访问包含命名空间的 xml 中的属性值

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:41 26 4
gpt4 key购买 nike

XML 文件:

<?xml version="1.0" encoding="iso-8859-1"?>
<rdf:RDF xmlns:cim="http://iec.ch/TC57/2008/CIM-schema-cim13#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<cim:Terminal rdf:ID="A_T1">
<cim:Terminal.ConductingEquipment rdf:resource="#A_EF2"/>
<cim:Terminal.ConnectivityNode rdf:resource="#A_CN1"/>
</cim:Terminal>
</rdf:RDF>

我还想获取 Terminal.ConnnectivityNode 元素的属性值和 Terminal 元素的属性值,作为上述 xml 的输出。我试过以下方法!

Python代码:

from elementtree import ElementTree as etree
tree= etree.parse(r'N:\myinternwork\files xml of bus systems\cimxmleg.xml')
cim= "{http://iec.ch/TC57/2008/CIM-schema-cim13#}"
rdf= "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}"

将下面的行附加到代码中

print tree.find('{0}Terminal'.format(cim)).attrib

output1: : 符合预期

{'{http://www.w3.org/1999/02/22-rdf-syntax-ns#}ID': 'A_T1'}

如果我们将下面这行附加到上面的代码

print tree.find('{0}Terminal'.format(cim)).attrib['rdf:ID'] 

output2: rdf:ID 中的关键错误

如果我们将下面这行附加到上面的代码

print tree.find('{0}Terminal/{0}Terminal.ConductivityEquipment'.format(cim))

output3

如何将output2作为A_T1 & Output3作为#A_CN1?

上面代码中的{0}是什么意思,我发现一定是通过net使用没看懂?

最佳答案

首先,您想知道的 {0} 是 Python 内置字符串格式化工具的语法的一部分。 The Python documentation has a fairly comprehensive guide to the syntax.在您的情况下,它只是被 cim 替换,这导致字符串 {http://iec.ch/TC57/2008/CIM-schema-cim13#}Terminal.

这里的问题是 ElementTree 在命名空间方面有点傻。您不能简单地提供命名空间前缀(如 cim:rdf:),而必须以 XPath 形式提供。这意味着rdf:id变成了{http://www.w3.org/1999/02/22-rdf-syntax-ns#}ID,非常笨拙。

ElementTree 确实支持 a way to use the namespace prefix for finding tags ,但不适用于属性。这意味着您必须自己将 rdf: 扩展为 {http://www.w3.org/1999/02/22-rdf-syntax-ns#} .

在您的情况下,它可能如下所示(另请注意 ID 区分大小写):

tree.find('{0}Terminal'.format(cim)).attrib['{0}ID'.format(rdf)]

这些替换扩展为:

tree.find('{http://iec.ch/TC57/2008/CIM-schema-cim13#}Terminal').attrib['{http://www.w3.org/1999/02/22-rdf-syntax-ns#}ID']

跳过这些环之后,它就可以工作了(但是请注意,ID 是 A_T1 而不是 #A_T1)。当然,处理这些真的很烦人,所以你也可以切换到lxml。并主要为您处理。

您的第三个案例不起作用仅仅是因为 1) 它被命名为 Terminal.ConductingEquipment 而不是 Terminal.ConductivityEquipment,以及 2) 如果您真的想要 A_CN1 而不是 A_EF2,那是 ConnectivityNode 而不是 ConductingEquipment。您可以使用 tree.find('{0}Terminal/{0​​}Terminal.ConnectivityNode'.format(cim)).attrib['{0}resource'.format( rdf)].

关于python - 如何在 python 中使用 ElementTree 访问包含命名空间的 xml 中的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44282975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com