Python 从xml节点获取具有特定值的属性
我有一个XSD文件,需要在其中获取根标记中定义的名称空间:Python 从xml节点获取具有特定值的属性,python,xml,Python,Xml,我有一个XSD文件,需要在其中获取根标记中定义的名称空间: <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.liegenschaftsbest
<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>
但是
root.attrib
只包含elementFormDefault
、targetNamespace
和version
,而不包含xmlns:abw
字符串必须为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
使用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中首先出现的内容。当然,我们应该忽略第一种情况,但这超出了这个问题的范围。是否要在targetNamespace=root.getattribute(“targetNamespace”)中搜索名称空间回溯(最近一次调用):文件“”,第1行AttributeError:Element实例没有属性“getattribute”
getattribute
而不是getattribute
@HishamKaram谢谢您的提示,并进行了相应的更新。这似乎有效,但我不理解使用for循环节点的字典定义,节点位于..
@HimBromBeere查看名称空间部分@HimBromBeereiterparse
返回事件
和元素
i忽略事件。元素为tupel
包含名称空间
和值
为便于搜索,我将结果转换为dict
>>> 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
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