PyXB - Созданный модуль использует анонимные имена структур? - PullRequest
0 голосов
/ 07 ноября 2018

Я сгенерировал модуль, используя это определение схемы 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 ?

Моя конечная цель - получить доступ к этим элементам по тегу / имени / типу. Есть ли способ сделать это?

...