在Google App Engine中将数据导出为XML文件

1 投票
3 回答
1499 浏览
提问于 2025-04-16 12:27

我正在尝试在Google App Engine上导出数据到一个XML文件,使用的是Python/Django。这个文件预计会包含多达10万个记录转换成XML格式。请问在App Engine中有没有类似于:

f = file('blah', 'w+')
f.write('whatever')
f.close()

的功能呢?

谢谢

编辑 我想要实现的是将一些信息导出到一个XML文档,这样就可以导出到Google Places(我不太清楚具体是怎么操作的,但有人告诉我,Google会不定期地获取这个XML文件)。

3 个回答

0

作者提到的内容可能是关于网站地图

网站地图是一种简单的方法,帮助网站管理员告诉搜索引擎他们网站上有哪些页面可以被抓取。简单来说,网站地图就是一个XML文件,里面列出了网站的所有网址,并附带一些额外的信息,比如每个网址最后一次更新的时间、通常更新的频率,以及相对于网站其他网址的重要性,这样搜索引擎就能更聪明地抓取网站内容。

至于我认为你需要的,是将XML写入请求对象,像这样:

doc.writexml(self.response.out)

在我的情况下,我是根据客户端发送的mime类型来做这个的:

_MIME_TYPES = {
    # xml mime type needs lower priority, that's needed for WebKit based browsers,
    # which add application/xml equally to text/html in accept header
    'xml':  ('application/xml;q=0.9', 'text/xml;q=0.9', 'application/x-xml;q=0.9',),
    'html': ('text/html',),
    'json': ('application/json',), 
}

mime = self.request.accept.best_match(reduce(lambda x, y: x + y, _MIME_TYPES.values()))
if mime:
    for shortmime, mimes in _MIME_TYPES.items():
        if mime in mimes:
            renderer = shortmime
            break
# call specific render function
renderer = 'render' + renderer
logging.info('Using %s for serving response' % renderer)
try:
    getattr(self.__class__, renderer)(self)
except AttributeError, e:
    logging.error("Missing renderer %s" % renderer)
0

每个数据存储模型类都有一个实例方法 to_xml(),这个方法可以生成该数据存储类型的 XML 表示。

  1. 运行你的查询,获取你想要的记录。
  2. 根据需要设置响应的内容类型——如果你想提示用户将文件保存到本地,还需要添加一个 content-disposition 头信息。
  3. 生成你需要的 XML 前言,这些内容会在记录数据之前。
  4. 遍历查询结果,对每一条记录调用 to_xml() 方法,并将输出添加到你的响应中。
  5. 完成你需要的 XML 前言的收尾工作。
1

你也可以用Django模板来生成XML文件。其实,模板里不一定非得包含HTML。比如,我就是用这种方法来生成我博客的Atom订阅源。这个模板大概是这样的。我把要放进订阅源的文章集合传给它,每篇文章都有一个叫to_atom的方法,用来生成它的Atom格式。

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"
      xml:lang="en"
      xml:base="http://www.example.org">
  <id>urn:uuid:4FC292A4-C69C-4126-A9E5-4C65B6566E05</id>
  <title>Adam Crossland's Blog</title>
  <subtitle>opinions and rants on software and...things</subtitle>
  <updated>{{ updated }}</updated>
  <author>
    <name>Adam Crossland</name>
    <email>adam@adamcrossland.net</email>
  </author>
  <link href="http://blog.adamcrossland.net/" />
  <link rel="self" href="http://blog.adamcrossland.net/home/feed" />
  {% for each_post in posts %}{{ each_post.to_atom|safe }}
  {% endfor %}
</feed>

撰写回答