使用xsd文件时如何避免在pyxb中创建匿名类

时间:2015-05-10 11:33:57

标签: xml python-3.x pyxb

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

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

pyxben -u my_schema.csd -m my_schema

如果我在python3中导入my_schema并使用my_schema.CreateFromDocument('some correct looking 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 个答案:

答案 0 :(得分:1)

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

有关此架构风格的讨论以及如何在the PyXB documentation中处理它。另请参阅该论坛上的this posting和其他人。

回复编辑

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

这听起来就像你所说的那样#34; class&#34;是PyXB称之为element的东西。 PyXB允许您在代码中使用元素,就像它们是创建绑定实例的类一样,但它们不是类。

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

print my_object._element().name()