我有一个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
仅包含elementFormDefault
,targetNamespace
和version
,但不包含xmlns:abw
。
答案 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
这将返回targetNamespace
或xmlns:abw
,具体取决于xsd中的第一个内容。当然,我们应该忽略第一种情况,但这超出了这个问题的范围。