Я сгенерировал модуль, используя это определение схемы XML :
$ pyxbgen -u "https://cwmp-data-models.broadband-forum.org/cwmp-1-2.xsd" -m cwmp
[Warnings about duplicate SOAP encoding/envelope complex types omitted]
Python for urn:dslforum-org:cwmp-1-2 requires 3 modules
.. и у меня есть следующий действительный XML документ, соответствующий схеме:
<SOAP-ENV:Envelope
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cwmp="urn:dslforum-org:cwmp-1-2"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<SOAP-ENV:Header>
<cwmp:ID SOAP-ENV:mustUnderstand="1">Testing123</cwmp:ID>
<cwmp:HoldRequests SOAP-ENV:mustUnderstand="1">1</cwmp:HoldRequests>
</SOAP-ENV:Header>
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<cwmp:GetParameterNames>
<ParameterPath>InternetGatewayDevice.</ParameterPath>
<NextLevel>1</NextLevel>
</cwmp:GetParameterNames>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Когда я использую модуль, я вижу элементы Header
и Body
очень хорошо, но все остальные элементы заканчиваются автоматически генерируемыми именами типов и доступны только через wildcardElements
:
>>> import cwmp
>>>
>>> with open("sample.xml", "r") as f:
... doc = f.read()
>>> xml = cwmp.CreateFromDocument(doc)
>>> xml.Header
<_soapenv.Header_ object at 0x6fffde73ad0>
>>> xml.Body
<_soapenv.Body_ object at 0x6fffdcb3390>
# I expect these to exist, but apparently they don't
>>> xml.Header.ID
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Header_' object has no attribute 'ID'
>>> xml.Header.HoldRequests
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Header_' object has no attribute 'HoldRequests'
>>> xml.Body.GetParameterNames
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Body_' object has no attribute 'GetParameterNames'
# I can see that they have child elements of the correct type
# so why can't I access them by name?
>>> xml.Body.wildcardElements()
[<cwmp.CTD_ANON_8 object at 0x6fffdcb36d0>]
>>> cwmp.GetParameterNames()
<cwmp.CTD_ANON_8 object at 0x6fffdedba90>
>>> xml.Header.wildcardElements()
[<cwmp.CTD_ANON_56 object at 0x6fffdcb3310>, <cwmp.CTD_ANON_57 object at 0x6fffdcb34d0>]
>>> cwmp.ID("Foo")
<cwmp.CTD_ANON_56 object at 0x6fffde73250>
>>> cwmp.HoldRequests(True)
<cwmp.CTD_ANON_57 object at 0x6fffe025d90>
Что здесь происходит?
XSD сломан? Я неправильно понимаю, как использовать PyXB ?
Моя конечная цель - получить доступ к этим элементам по тегу / имени / типу. Есть ли способ сделать это?