2016-10-19 2 views
1

У меня есть XSD-файл, где мне нужно, чтобы получить пространство имен, как это определено в корневом теге:получить атрибут из XML-узла с определенным значением

<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 (я не могу полагаться на идентификатор, являющийся частью -string 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 
+0

Это похоже на работу, однако я не понимаю определения словарей, используя узел for-loop для _, node in ..'. – HimBromBeere

+0

@HimBromBeere посмотреть раздел пространства имен [ссылка] (http://effbot.org/zone/element-iterparse.htm) –

+0

@HimBromBeere 'iterparse' возвращает событие event и' element' i ignored. Элемент как 'tupel', содержащий 'namespace' и' value', я преобразовал результат в 'dict' для легкого поиска. –

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. Конечно, мы должны игнорировать первый случай, но это выходит за рамки этого вопроса.

+0

' Traceback (последний последний звонок): Файл «», строка 1, в targetNamespace = root .getattribute ("targetNamespace") AttributeError: экземпляр элемента не имеет атрибута 'getattribute'' –

+0

'getAttribute' вместо' getattribute' –

+0

@HishamKaram Спасибо за подсказку, обновленную соответствующим образом. – HimBromBeere

Смежные вопросы