从xml-node获取具有特定值

时间:2016-10-19 06:19:06

标签: python xml

我有一个XSD文件,我需要获取root标签中定义的命名空间:

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:abw="http://www.liegenschaftsbestandsmodell.de/ns/abw/1.0.1.0" xmlns:adv="http://www.adv-online.de/namespaces/adv/gid/6.0" xmlns:bfm="http://www.liegenschaftsbestandsmodell.de/ns/bfm/1.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:sc="http://www.interactive-instruments.de/ShapeChange/AppInfo" elementFormDefault="qualified" targetNamespace="http://www.liegenschaftsbestandsmodell.de/ns/abw/1.0.1.0" version="1.0.1.0">
  <!-- elements -->
</schema>

现在,由于此模式定义的targetNamespace"http://www.liegenschaftsbestandsmodell.de/ns/abw/1.0.1.0",我需要获取此命名空间的短标识符 - abw。要获得此标识符,我必须从与我的targetNamespace具有完全相同值的root-tag获取该属性(我不能依赖于targetNamespace的标识符部分 - 字符串allready,这可能在未来发生变化)。

关于这个问题How to extract xml attribute using Python ElementTree我找到了如何获取由其名称给出的属性的值。但是我不知道属性名称,只知道它的值,所以当有值并且想要选择具有该值的属性时,我该怎么办?

我想到这样的事情:

for key in root.attrib.keys():
    if(root.attrib[key] == targetNamespace):
        return root.attrib[key]

root.attrib仅包含elementFormDefaulttargetNamespaceversion,但不包含xmlns:abw

2 个答案:

答案 0 :(得分:1)

字符串必须是Unicode否则会出现错误

Traceback (most recent call last):
  File "<pyshell#62>", line 1, in <module>
    it = etree.iterparse(StringIO(xml))
TypeError: initial_value must be unicode or None, not str

代码:

>>> from io import StringIO
>>> from xml.etree import ElementTree
>>> xml=u"""<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:abw="http://www.liegenschaftsbestandsmodell.de/ns/abw/1.0.1.0" xmlns:adv="http://www.adv-online.de/namespaces/adv/gid/6.0" xmlns:bfm="http://www.liegenschaftsbestandsmodell.de/ns/bfm/1.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:sc="http://www.interactive-instruments.de/ShapeChange/AppInfo" elementFormDefault="qualified" targetNamespace="http://www.liegenschaftsbestandsmodell.de/ns/abw/1.0.1.0" version="1.0.1.0">
  <!-- elements -->
</schema>"""
>>> ns = dict([
    node for _, node in ElementTree.iterparse(
        StringIO(xml), events=['start-ns']
    )
])
>>> for k,v in ns.iteritems():
    if v=='http://www.liegenschaftsbestandsmodell.de/ns/abw/1.0.1.0':
        print k

输出:

abw 

答案 1 :(得分:0)

使用minidom代替ETree做到了:

import xml.dom.minidom as DOM
tree = DOM.parse(myFile)
root = tree.documentElement
targetNamespace = root.getAttribute("targetNamespace")

d = dict(root.attributes.items())
for key in d:
    if d[key] == targetNamespace: return key

这将返回targetNamespacexmlns:abw,具体取决于xsd中的第一个内容。当然,我们应该忽略第一种情况,但这超出了这个问题的范围。