[英]Unable to bind to pyxb classes with nested (anonymous) types
我遵循了该线程和XML的说明:
<?xml version="1.0" encoding="UTF-8" ?>
<my_report>
<something>
<foo>
Yes
</foo>
</something>
<something_else>
<id>4</id>
<foo>Finally</foo>
<score>0.2</score>
</something_else>
</my_report>
我使用此工具在线创建了以下XSD架构。
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="my_report">
<xs:complexType>
<xs:sequence>
<xs:element name="something">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="foo"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="something_else">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:byte" name="id"/>
<xs:element type="xs:string" name="foo"/>
<xs:element type="xs:float" name="score"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
然后,我在外壳pyxben -u my_schema.csd -m my_schema
中调用pyxben -u my_schema.csd -m my_schema
,然后尝试使用绑定构建对象:
from my_schema import my_report
my_xml_report = my_report()
到目前为止,这似乎可行(我可以访问my_xml_report.something
)。 但是,当我尝试填充嵌套元素时:
my_xml_report.something.foo = "No"
我得到错误'NoneType'object has no atttribute 'foo'
。
该文档讨论的anonymous types
似乎与我的问题有关,但是我仍然无法使其正常工作:
import pyxb
my_xml_report.something = pyxb.BIND('foo', "No")
我收到错误MixedContentError: invalid non-element content
如何填写该XML?
非规范化模式很困难,您可能需要尝试几种方法来提供所需的信息。 这是一个带注释的示例,尽管我使用的是PyXB 1.2.3,所以功能可能会更完整一些:
import pyxb
import my_schema
rep = my_schema.my_report()
# The something element here is very simple, with a single string
# element. For the inner string element foo PyXB can figure things
# out for itself. For the outer element it needs help.
#
# In a normalized schema where the type of something was tSomething,
# you would do:
#
# rep.something = tSomething('yes')
#
# Without a tSomething easily reachable, to build it up piece-by-piece
# you could do:
rep.something = pyxb.BIND() # Create an instance of whatever type satisfies something
rep.something.foo = 'yes' # Assign to the foo element of what got created
# You can then optimize. Here pyxb.BIND substitutes for the something
# element wrapper around that string, and figures out for itself that
# the "yes" can only go in the foo element:
rep.something = pyxb.BIND('yes')
# In fact, sometimes PyXB can even figure out the intermediate
# intermediate layers:
rep.something = 'yes'
# No more than two of them, though (and the lowest must be a simple type).
# Similarly here pyxb.BIND substitutes for the type of the
# something_else element. Again the inner content is unambiguous and
# sequential, so the values can be provided in the constructor.
rep.something_else = pyxb.BIND(4, 'finally', 0.2)
print rep.toxml('utf-8')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.