如何在django-piston中更改xml元素名称?

时间:2011-12-02 05:59:47

标签: python xml django django-piston

我是django-piston的新手,每当我将数据发送到xml时,xml的元素总是  和<资源>

<response>
<resource>
 <resource>4</resource>
 <resource>0</resource>
 <resource>2011-11-30</resource>
</resource>
<resource>
 <resource>4</resource>
 <resource>4</resource>
 <resource>2011-12-01</resource>
</resource>
<resource>
 <resource>4</resource>
 <resource>0</resource>
 <resource>2011-12-02</resource>
</resource>
<resource>
 <resource>4</resource>
 <resource>0</resource>
 <resource>2011-12-03</resource>
</resource>
<resource>
 <resource>4</resource>
 <resource>0</resource>
 <resource>2011-12-04</resource>
</resource>
</response>

有没有办法在handlers.py中更改它? 我只是想将资源转化为产品,如果可能的话,我还可以为xml元素添加一个id吗?

2 个答案:

答案 0 :(得分:2)

您必须编写自己的XMLEmitter。这是一个始终使用标记product而不是resource

使其智能化需要更多的工作,因为模型在Emitter.construct()方法中被序列化为dicts,并且无法正确扩展。很高兴知道_to_xml()方法中的原始模型类,并根据类名命名元素。

from piston.emitters import Emitter, XMLEmitter

class ProductXMLEmitter(XMLEmitter):
    def _to_xml(self, xml, data):
        if isinstance(data, (list, tuple)):
            for item in data:
                attrs = {}
                # if item contains id value, use it as an attribute instead
                if isinstance(item, dict):
                    attrs["id"] = unicode(item.pop("id"))
                xml.startElement("product", attrs)
                self._to_xml(xml, item)
                xml.endElement("product")
        else:
            super(BetterXMLEmitter, self)._to_xml(xml, data)

# replace default XMLEmitter with ours
Emitter.register('xml', ProductXMLEmitter, 'text/xml; charset=utf-8')

另外,您可能希望在https://github.com/pbs-education/django-piston查看PBS Education的django-piston前叉。它允许您使用PistonViews以其他方式自定义输出。

答案 1 :(得分:0)

Elementtree会帮助你。您可以更改要更改的内容,读取文件,使用elementree解析它并更新值并再次将其放入文件(如果需要)。