Как избежать создания анонимных классов в pyxb при использовании файла xsd

Я пытаюсь реализовать соединение с некоторым API. Во время общения я получаю как полезный код xml. Они предоставляют.xsd-файл с описанием xml. Теперь я хочу проанализировать строку xml и получить соответствующий класс в ответ. Эта функциональность, кажется, лучше всего реализована PyXB.

Для создания привязок Python я использовал следующий код:

pyxben -u my_schema.csd -m my_schema

Если я импортирую my_schema в python3 и использую my_schema.CreateFromDocument("некоторые правильно выглядящие xml"), для некоторых классов он возвращает правильный класс, для некоторых классов он возвращает некоторый анонимный тип класса. Все переменные реализованы правильно, то есть они становятся атрибутом возвращаемого класса, но тип класса неверен.

Это очевидно из источника my_schema.py, потому что тип класса установлен в CTD_ANON_XX. Некоторые друзья реализовали то же самое в C#, и все работало нормально, поэтому схема xsd, похоже, в порядке (и источник предполагает, что она должна быть в порядке).

Привязки Python работают, например, для следующего класса:

<xs:complexType name="OrdrBookEntry">
    <xs:attribute name="ordrId" type="longType" use="required"/>
    <xs:attribute name="qty" type="quantityType" use="required"/>
    <xs:attribute name="px" type="priceType" use="required"/>
    <xs:attribute name="ordrEntryTime" type="dateTimeType" use="required"/>
    <xs:attribute name="ordrExeRestriction" type="ordrRestrictionType" use="optional"/>
    <xs:attribute name="ordrType" type="ordrType" use="optional" />
</xs:complexType>

Но это не работает для следующего типа:

<xs:element name="PblcOrdrBooksResp" final="#all">
    <xs:complexType>
        <xs:annotation>
            <xs:documentation>

            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="StandardHeader" type="standardHeaderType" minOccurs="1" maxOccurs="1"/>
            <xs:element name="OrdrbookList"  minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence minOccurs="1" maxOccurs="1">
                        <xs:element name="OrdrBook" type="OrdrBook" minOccurs="0" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Как уже упоминалось, определение отлично работает в C#. Это ошибка в pyxb или что-то не так с определением xml? Я что-то упускаю из-за использования pyxb? Может кто-нибудь мне помочь?

Я хочу не играть с определением схемы. Если выйдет новый релиз, мне нужно будет снова и снова все исправлять...

РЕДАКТИРОВАТЬ: Чтобы уточнить: мы получаем заголовок xml, как показано ниже:

<?xml version="1.0" ?><PblcOrdrBooksResp xmlns="www.apisite.com">
<StandardHeader marketId="EPEX"/>
<OrdrbookList>
...
</OrdrbookList></PblcOrdrBooksResp>

Теперь мы хотим использовать pyxb, чтобы инициировать правильный класс, а затем прочитать из объекта, какой контент был отправлен!?

Таким образом, из приведенного выше примера мы ожидаем (или желаем)

my_object = mypyxb.module.CreatefromDocument(xml)
type(my_object)

вернуть его тип

PblcOrdrBooksResp

Или, по крайней мере, иметь атрибут с правильным типом...

1 ответ

Решение

Это не ошибка PyXB и не что-то не так с вашей схемой - это следствие разработки схемы. Внутренний OrdrBookList Элемент имеет тип, который не имеет имени в своем собственном праве, потому что он определен в контексте другого типа, который является для вмещающего элемента PblkOrdrBooksResp (который также не имеет названия). Элементы и типы - это не одно и то же, поэтому они должны иметь разные имена: попытка вывести неанонимное имя для внутреннего типа может создать конфликты, когда один и тот же элемент использует другой тип в другом контексте. PyXB избегает этого, делая явную анонимность.

Обсуждение этого стиля схемы и того, как с ним работать, приведено в документации PyXB. Смотрите также эту публикацию и другие на этом форуме.

Ответ на редактирование

Вы создаете экземпляр класса из XML. Вы преобразовали XML в экземпляр Python типа Python, который соответствует типу XML, который не имеет имени. Тип Python имеет имя: уникальный идентификатор, указывающий, что это анонимный сложный тип.

Похоже, то, что вы называете "классом", это то, что PyXB называет элементом. PyXB позволяет использовать элементы в коде, как если бы они были классами для создания связанных экземпляров, но они не являются классами.

Экземпляр, созданный вами из XML, привязан к элементу с расширенным именем. Вы увидите это, когда преобразуете экземпляр обратно в XML или сможете получить имя, область действия и другую информацию, вызвав my_object._element ():

print my_object._element().name()
Другие вопросы по тегам