Help us understand the problem. What is going on with this article?

PythonでXML(RSS)を生成する

More than 1 year has passed since last update.

はじめに

PythonでRSS ver2を出力する必要があったのですが、その際に何度かコケたのでメモ。

Pythonはjsonと親和性が高いですが、XMLは扱いづらいように思います。
以下のようにいくつかライブラリはあるものの何かとやりたいことが実現できず。

  • feedgenerator
    → google製で良さげに見えるが、lastUpdateなど独自仕様のタグを生成できない
  • xml.etree.ElementTree
    → タグ要素に日本語を入れるとExpatErrorが発生

やり方

結局DOMオブジェクトからXMLに変換する方法で落ち着いた。

文字列のXMLテンプレートから生成する場合

#!/usr/bin/env python
# coding: utf-8

from xml.dom.minidom import parseString

xml_template = "<rss version=\"2.0\">\
        <channel>\
            <title>title</title>\
            <link>link</link>\
            <description>desctiption</description>\
            <language>ja</language>\
        </channel></rss>"
dom = parseString(xml_template)

# channelノードを取得
channel = dom.getElementsByTagName("channel")[0]

# itemノードを生成
item = dom.createElement('item')
# channelノードに追加
channel.appendChild(item)

# サブノードの生成
subnode = dom.createElement('subnode')
subnode.appendChild(dom.createTextNode("日本語もOK"))
# サブノートにattributeとvalueを設定
subnode_attr = dom.createAttribute('key')
subnode_attr.value = 'value'
subnode.setAttributeNode(subnode_attr)
# itemノードにsubnodeノードを追加
item.appendChild(subnode)

# domをxmlに変換して整形
print (dom.toprettyxml())

出力

<?xml version="1.0"?>
<rss version="2.0">
  <channel>
    <title>title</title>
    <link>link</link>
    <description>desctiption</description>
    <language>ja</language>
    <item>
      <subnode key="value">日本語もOK</subnode>
    </item>
  </channel>
</rss>

1からXMLを生成する場合

#!/usr/bin/env python
# coding: utf-8

import xml.dom.minidom

# DOMオブジェクトの生成
dom = xml.dom.minidom.Document()

# rootノードの生成と追加
root = dom.createElement('root')
dom.appendChild(root)

# サブノードの生成
subnode = dom.createElement('subnode')
subnode.appendChild(dom.createTextNode("日本語もOK"))
# サブノートにattributeとvalueを設定
subnode_attr = dom.createAttribute('key')
subnode_attr.value = 'value'
subnode.setAttributeNode(subnode_attr)
# itemノードにsubnodeノードを追加
root.appendChild(subnode)

# domをxmlに変換して整形
print (dom.toprettyxml())

出力

<?xml version="1.0"?>
<root>
  <subnode key="value">日本語もOK</subnode>
</root>

まとめ

json最高

Reference

icchi_h
都内のメディア企業で働く高専出身エンジニア
https://icchi.me
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした