PyXB将anyAttribute属性添加到生成的Python类中

时间:2014-06-05 00:47:02

标签: python xml custom-attributes pyxb

鉴于架构:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
    <xs:anyAttribute/>
  </xs:complexType>
</xs:element>

并且在运行pyxb -u <filename> -m person命令之后,如何使用生成的绑定创建具有任意属性的XML。

import person

p = person()
p.firstname = 'bob'
p.lastname  = 'bobbington'

#I want behavior like this
p.middlename = 'bobby'

#I would settle for behavior like this:
p.add_attribute( 'middlename', 'bobby' )

#Heck*, I'd even settle for:
temp_attr = pyxb.AttributeUse( name, value, blah, blah, blay )
p._AttributeMap.update( temp_attr.name(), temp_attr )

但无论我尝试什么,我都无法在调用p.toxml()时显示临时属性

这不受支持吗?或者我忽略了什么?

编辑:删除亵渎。

编辑:做了一个解决方法(语法和变量名称都已关闭,但希望它足以帮助其他人解决问题)

class PersonType():
    '''
    regular generated PersonType stuff here
    '''
    def add_attribute(self, name, value):
        t = pyxb.blahblahblah._AttributeUse(
            pyxb.blahblahblah._ExtendedName( None, attr_name),
            attr_name,
            pyxb.blahblah.StringDataType)
        t.setValue(self, value)  # or maybe _setValue
        self._AttributeMap[t.name()] = t

1 个答案:

答案 0 :(得分:1)

如果复杂类型支持通配符属性,则该类型的实例具有方法wildcardAttributeMap(),该方法是从扩展名到表示属性值的unicode字符串的映射。每this ticket,目前没有公共API可以操作此地图,但您可以手动执行此操作。

在审核您的问题的基础上,我添加了this ticket,确认即使您将通配符属性放入地图,它们也不会显示在生成的XML中。

很抱歉。看起来是时候进行另一轮PyXB错误修复了。