1

ElementTree を使用して wsdl ファイルを解析しようとしています。その一環として、特定の 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 を初めて使用します。

4

2 に答える 2

2
>>> 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 のドキュメントに触発されました

于 2011-11-18T10:14:36.750 に答える
0

使用できますlxml

from lxml import etree
tree = etree.parse(file)
root = tree.getroot()
namespaces = root.nsmap

https://stackoverflow.com/a/26807636/5375693を参照してください

于 2016-03-12T14:53:12.120 に答える