【问题标题】:Unable to bind to pyxb classes with nested (anonymous) types无法绑定到具有嵌套(匿名)类型的 pyxb 类
【发布时间】:2013-07-11 02:56:19
【问题描述】:

我遵循了来自this thread 的说明以及来自此 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>

我使用 this tool online 创建了以下 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>

然后我在shell中调用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'

The documentation 谈论anonymous types 似乎与我的问题有关,但我仍然无法让它工作:

import pyxb
my_xml_report.something = pyxb.BIND('foo', "No")

我收到错误MixedContentError: invalid non-element content

我该如何填写这个 XML?

【问题讨论】:

    标签: python xml xsd pyxb


    【解决方案1】:

    非规范化架构很困难,您可能需要尝试多种方法来提供所需的信息。这是一个带注释的示例,虽然我使用的是 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')
    

    【讨论】:

      猜你喜欢
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多