Nik*_*hil 4 python xml elementtree xml-namespaces python-2.7
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>
Run Code Online (Sandbox Code Playgroud)
我想将 Terminal.ConnnectivityNode 元素的属性值和 Terminal 元素的属性值也作为上述 xml 的输出。我已经尝试过以下方式!
蟒蛇代码:
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#}"
Run Code Online (Sandbox Code Playgroud)
将以下行附加到代码中
print tree.find('{0}Terminal'.format(cim)).attrib
Run Code Online (Sandbox Code Playgroud)
output1 :: 是预期的
{'{http://www.w3.org/1999/02/22-rdf-syntax-ns#}ID': 'A_T1'}
Run Code Online (Sandbox Code Playgroud)
如果我们将下面这行附加到上面的代码中
print tree.find('{0}Terminal'.format(cim)).attrib['rdf:ID']
Run Code Online (Sandbox Code Playgroud)
输出 2:rdf:ID 中的关键错误
如果我们将下面这行附加到上面的代码中
print tree.find('{0}Terminal/{0}Terminal.ConductivityEquipment'.format(cim))
Run Code Online (Sandbox Code Playgroud)
输出 3无
如何获得输出2为A_T1和 输出3为#A_CN1?
上面代码中{0}的意义是什么,我发现它必须通过net使用没有得到它的意义吗?
首先,{0}您想知道的是 Python 内置字符串格式化工具语法的一部分。Python 文档有一个相当全面的语法指南。在您的情况下,它只是被替换为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确实支持使用命名空间前缀查找标签的方法,但不支持属性。这意味着你必须扩展rdf:到{http://www.w3.org/1999/02/22-rdf-syntax-ns#}你自己。
在您的情况下,它可能如下所示(还要注意ID区分大小写):
tree.find('{0}Terminal'.format(cim)).attrib['{0}ID'.format(rdf)]
Run Code Online (Sandbox Code Playgroud)
这些替换扩展为:
tree.find('{http://iec.ch/TC57/2008/CIM-schema-cim13#}Terminal').attrib['{http://www.w3.org/1999/02/22-rdf-syntax-ns#}ID']
Run Code Online (Sandbox Code Playgroud)
跳过这些箍后,它就可以工作了(但是请注意,ID 是A_T1而不是#A_T1)。当然,这一切都非常烦人,因此您也可以切换到lxml并为您处理大部分内容。
你的第三种情况不能仅仅因为 1) 它被命名Terminal.ConductingEquipment而不是Terminal.ConductivityEquipment2) 如果你真的想要A_CN1而不是A_EF2,那是 ,ConnectivityNode而不是ConductingEquipment. 你可以A_CN1用tree.find('{0}Terminal/{0}Terminal.ConnectivityNode'.format(cim)).attrib['{0}resource'.format(rdf)]。