【问题标题】:How to avoid the creation of anonymous classes in pyxb when using xsd file使用xsd文件时如何避免在pyxb中创建匿名类
【发布时间】:2015-05-10 11:33:56
【问题描述】:

我正在尝试实现与某些 API 的连接。在通信过程中,我得到了有效载荷 xml 代码。他们提供了一个带有 xml 描述的 .xsd 文件。现在我想解析 xml 字符串并获得相应的类作为回报。这个功能似乎最好由 PyXB 实现。

为了创建 python 绑定,我使用了以下代码:

pyxben -u my_schema.csd -m my_schema

如果我在 python3 中导入 my_schema 并使用 my_schema.CreateFromDocument('some correctlooking 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

或者至少有一个类型正确的属性...

【问题讨论】:

    标签: xml python-3.x pyxb


    【解决方案1】:

    这既不是 PyXB 中的错误,也不是您的架构有问题——这是架构设计的结果。内部OrdrBookList 元素的类型本身没有名称,因为它是在另一种类型的上下文中定义的,即封闭元素PblkOrdrBooksResp(也没有名称)的上下文。元素和类型不是一回事,所以它们必须有different names:当同一个元素在不同的上下文中使用不同的类型时,试图为内部类型推断一个非匿名名称可能会产生冲突。 PyXB 通过明确匿名来避免这种情况。

    the PyXB documentation 讨论了这种模式风格以及如何处理它。另请参阅 this posting 和该论坛上的其他人。

    对编辑的回应

    您正在从 xml 实例化类。您将 XML 转换为 Python 类型的 Python 实例,该实例对应于没有名称的 XML 类型。 Python 类型有一个名称:一个唯一标识符,表明它是一个匿名复杂类型。

    听起来你所说的“类”就是 PyXB 所说的element。 PyXB 允许您在代码中使用元素,就好像它们是类一样来创建绑定实例,但它们不是类。

    您从 XML 创建的实例绑定到具有expanded name 的元素。当您将实例转换回 XML 时会看到它,或者可以通过调用 my_object._element() 来获取名称、范围和其他信息:

    print my_object._element().name()
    

    【讨论】:

    • 您提供的引用直接实例化类,而我们有 xml 并希望从中实例化类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2011-04-23
    相关资源
    最近更新 更多