【问题标题】:Python framework for object-XML mapping through decorators?通过装饰器进行对象-XML 映射的 Python 框架?
【发布时间】:2013-11-17 00:29:32
【问题描述】:

在对 Java 中的 XML 序列化框架Simple XML 的易用性印象深刻之后,我尝试寻找一个 Python 对应物,它可以促进以类似方式实现类及其 XML 序列化。到目前为止,尽管有一些有趣的候选人(但据我所知,没有人方便地使用decorators),但我或多或少是空手而归;例如,我开始查看dexml,但我被一个简单的例子难住了,比如实现一个允许反序列化的类

<Error Code="0">OK</Error>

使用 Java 中的 Simple,我可以编写一个类,例如

@Root(name="Error")
public class Error {

    @Attribute(name = "Code")
    private int code;  // public getter and setter

    @Text(required = false) 
    private String description; // public getter and setter
}

在 Python 中是否已经有与 Simple for Java 类似的风格框架?我偏爱 Python 2.6 支持,尽管这不是强制性的;如果它仅支持 Python 3,我也会研究它。

【问题讨论】:

    标签: python xml serialization decorator


    【解决方案1】:

    实际上dexml中支持这种语法。我花了一段时间才弄明白(阅读源代码有帮助)。

    class Error(dexml.Model):
        code = dexml.fields.String()
        value = dexml.fields.String(tagname=".")
    

    而下面会返回desire的xml渲染:

    e = Error(code="0",value="OK")
    print e.render(fragment=True)
    

    【讨论】:

      【解决方案2】:

      没有答案,但会确认使用 dexml 解析示例的难度。看起来没有一种方法可以解析具有属性和文本节点的元素。定义 Code 属性很简单:

      class Error(dexml.Model):
          code = dexml.fields.String(attrname="Code")
      

      但是没有办法引用子文本节点。一个人想做这样的事情:

      class Error(dexml.Model):
          code = dexml.fields.String(attrname="Code")
          text = dexml.fields.String(textnode=True)
      

      捕获文本的一种不太令人满意的方法是将其包装在额外的标签中:

      <Error Code="0"><text>OK</text></Error>
      

      然后你可以定义类为:

      class Error(dexml.Model):
          code = dexml.fields.String(attrname="Code")
          text = dexml.fields.String(tagname="text")
      

      【讨论】:

        猜你喜欢
        • 2017-10-30
        • 1970-01-01
        • 2023-01-18
        • 1970-01-01
        • 1970-01-01
        • 2019-09-02
        • 2023-02-08
        • 2022-07-25
        • 1970-01-01
        相关资源
        最近更新 更多