Я пытаюсь проанализировать файл wsdl с помощью ElementTree. Как часть этого я хотел бы получить все пространства имен из данного элемента определений wsdl.
Например, в приведенном ниже фрагменте кода я пытаюсьчтобы получить все пространства имен в теге определения
<?xml version="1.0"?> <definitions name="DateService" targetNamespace="http://dev-b.handel-dev.local:8080/DateService.wsdl" xmlns:tns="http://dev-b.handel-dev.local:8080/DateService.wsdl" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:myType="DateType_NS" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
Мой код выглядит так
import xml.etree.ElementTree as ET xml_file='<path_to_my_wsdl>' tree = xml.parse(xml_file) rootElement = tree.getroot() print (rootElement.tag) #{http://schemas.xmlsoap.org/wsdl/}definitions print(rootElement.attrib) #targetNamespace="http://dev-b..../DateService.wsdl"
Как я понимаю, в ElementTree URI пространства имен объединяется с локальным именем элемента.Как я могу получить все записи пространства имен из элемента определения?
Благодарим вас за помощь в этом
PS: я новичок (очень!) В Python
>>> import xml.etree.ElementTree as etree >>> from StringIO import StringIO >>> >>> s = """<?xml version="1.0"?> ... <definitions ... name="DateService" ... targetNamespace="http://dev-b.handel-dev.local:8080/DateService.wsdl" ... xmlns:tns="http://dev-b.handel-dev.local:8080/DateService.wsdl" ... xmlns="http://schemas.xmlsoap.org/wsdl/" ... xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" ... xmlns:myType="DateType_NS" ... xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> ... </definitions>""" >>> file_ = StringIO(s) >>> namespaces = [] >>> for event, elem in etree.iterparse(file_, events=('start-ns',)): ... print elem ... (u'tns', 'http://dev-b.handel-dev.local:8080/DateService.wsdl') ('', 'http://schemas.xmlsoap.org/wsdl/') (u'soap', 'http://schemas.xmlsoap.org/wsdl/soap/') (u'myType', 'DateType_NS') (u'xsd', 'http://www.w3.org/2001/XMLSchema') (u'wsdl', 'http://schemas.xmlsoap.org/wsdl/')
Вдохновлено документацией ElementTree
Вы можете использовать lxml.
lxml
from lxml import etree tree = etree.parse(file) root = tree.getroot() namespaces = root.nsmap
см. https://stackoverflow.com/a/26807636/5375693