我正在尝试实现与某些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
或者至少有一个具有正确类型的属性......
答案 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()