Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从xml节点获取具有特定值的属性_Python_Xml - Fatal编程技术网

Python 从xml节点获取具有特定值的属性

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

我有一个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.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查看名称空间部分@HimBromBeere
iterparse
返回
事件
元素
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