その時々

その時々で違うんです。特に決まっていないんです。

PythonでXMLを触ってみる6 minidomね

前回はノードの削除をしました。
今回はタグ名を変換してみます。

ロジックが良くわからずpythonメーリングリストにお世話になりました。

Sample.xml

<?xml version="1.0" encoding="UTF-8"?>
<cars>
  <car>
    <name>乗用車</name>
    <price>150</price>
  </car>
  <car>
    <name>トラック</name>
    <price>500</price>
  </car>
  <car>
    <name>オープンカー</name>
    <price>200</price>
  </car>
</cars>

minidom8.py

# -*- coding: utf-8 -*-

import xml.dom
import xml.dom.minidom

translate_dict = {'cars': u'車リスト',
                  'car': u'車',
                  'name': u'名前',
                  'price': u'価格'}

def walk(doc, node):
    if (node.nodeType == xml.dom.Node.TEXT_NODE and
        len(node.nodeValue.strip()) == 0):
        return
    if node.nodeType == xml.dom.Node.TEXT_NODE:
        return doc.createTextNode(node.data)

    result = doc.createElement(translate_dict[node.nodeName])
    for child in node.childNodes:
        ch = walk(doc,child)
        if ch != None:
            result.appendChild(ch)

    return result

doc = xml.dom.minidom.parse('Sample.xml')
doc2 = xml.dom.minidom.Document()

root = doc.documentElement
root2 = walk(doc2, root)

doc2.appendChild(root2)

print(doc2.toprettyxml('  ', '\n', 'utf-8'))

実行結果

$ python minidom8.py
<?xml version="1.0" encoding="utf-8"?>
<車リスト>
  <車>
    <名前>
      乗用車
    </名前>
    <価格>
      150
    </価格>
  </車>
  <車>
    <名前>
      トラック
    </名前>
    <価格>
      500
    </価格>
  </車>
  <車>
    <名前>
      オープンカー
    </名前>
    <価格>
      200
    </価格>
  </車>
</車リスト>