从模型数据生成XML文件

13 投票
2 回答
14655 浏览
提问于 2025-04-16 04:48

我需要把模型数据(只有CharField类型)写入一个XML文件,这样可以给flash文件使用。我对这个过程还不太熟悉,特别是在django中怎么做。我的目标是创建一个XML文件,然后把文本数据写入这个文件(就像用csv模块那样,但这里是写入xml)。最终应该得到一个非常简单的XML文件,flash文件可以读取,比如:

<?xml version="1.0" encoding="UTF-8"?>
<textFields>
     <textField id="0" text="HELLO WORLD" />
     <textField id="1" text="HELLO EARTH" />
     ...
</textFields>

1. 我使用一个序列化器来从模型中写入xml数据:

from django.core import serializers
data = serializers.serialize('xml', myModel.objects.filter(instanceIwantTowrite), fields=('fieldName'))

2. 然后我用core.files来创建文件:

from django.core.files import File    
f = open('/path/to/new/dir/content.xml', 'w')
myfile = File(f)

3. 写入文件数据并关闭:

myfile.write(data)

myfile.close()

到目前为止,这个过程是有效的,不过生成的xml输出包含了一些“django-objects”等字段,我需要看看在ActionScript中是否能轻松理解这些内容,以便flash文件使用。我更希望像csv模块那样手动定义xml字段名称。因为我对django和python还很陌生,我在想有没有更简单的方法来做到这一点?

注意:在序列化器中,我对模型对象使用了过滤,因为用get获取模型实例会返回一个object not iterable的错误。实际上,我过滤了两次才能得到一个单一的实例,感觉应该有更好的方法。

2 个回答

1

为了更通用地解决这个问题,你可以通过一种简单的方法来处理模型,而不使用模板,并且可以使用ElementTree将任何复杂的对象结构转换成XML格式。

这是我解决这个问题的方法:

在你的Model.py文件中,可以像下面这样修改模型:

if hasattr(models.Model, "to_element")==False:
    import xml.etree.ElementTree as ET
    def to_element(self):
        ele = ET.Element(self.__class__.__name__)
        for field in self._meta.fields:
            ele.attrib[field.attname]=str(getattr(self,field.attname))
        return ele
    models.Model.to_element = to_element

这样做会给模型添加一个方法,这个方法会创建一个包含你关心的字段的Element实例,而不会包含django的一些多余内容。

然后,要构建你的XML文档,只需这样做:

dealer = Dealer.objects.get(id=dealer_id)
makes = DealerMake.objects.filter(dealer=dealer)

root = dealer.to_element()
for make in makes:
    root.append(make.to_element())

xml = ET.tostring(root)
print xml

通过这种方法,你可以得到一个格式良好的XML文档,所有django模型的字段都会作为属性,并且可以构建多层次的结构。每个XML节点的名称都会和模型类的名称相同。

28

这里有两种可能的解决方案:

1.

你可以扩展基础的 Django XML 序列化器(django.core.serializers.xml_serializer.Serializer),然后对它进行修改,使它能够按照你的数据结构返回数据。接着你可以运行:

YourSerializer('xml', myModel.objects.filter(instanceIwantTowrite), fields=('fieldName'))

这样就会输出符合你数据结构的数据。

2.

写一个简单的函数,这个函数会用你的数据结构渲染一个模板,并返回你想要格式的 XML 数据:

Python 代码

from django.template.loader import render_to_string

def my_serialize(query_set):
    xml = render_to_string('xml_template.xml', {'query_set': query_set})

    return xml

模板 xml_template.xml

<?xml version="1.0" encoding="UTF-8"?>
<textFields>
     {% for object in query_set %}
     <textField id="{{ object.pk }}" text="{{ object.my_field }}" />
     {% endfor %}
</textFields>

撰写回答