0

我正在尝试实现与某些 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

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

4

1 回答 1

1

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

在PyXB 文档中讨论了这种模式样式以及如何处理它。另请参阅该论坛上的此帖子和其他帖子。

回复编辑

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

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

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

print my_object._element().name()
于 2015-05-10T17:42:39.703 回答