2009年10月16日金曜日

DOMでXMLを解析する

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

import xml.dom.minidom

s = '<?xml version="1.0"?>\
<parent id="top">\
<child name="paul">Text goes here</child>\
<child name="fred">More text</child>\
</parent>'

def print_parent(emt):
    tup = (emt.tagName, emt.getAttribute("id"))
    print "['%s', {'id': '%s'}]" % tup
          
def print_child(emt):
    tup = (emt.tagName, emt.getAttribute("name"),
           emt.childNodes[0].data)
    print "['%s', {'name': '%s'}, '%s']" % tup

# 文字列からdomオブジェクトを生成
dom = xml.dom.minidom.parseString(s)

# ファイルからdomオブジェクトを生成する場合
# dom = xml.dom.minidom.parse("file.xml")

# dom から要素を取得する
parent_emt = dom.getElementsByTagName("parent")[0]
child_emt_list = parent_emt.getElementsByTagName("child")

# プリントする
print_parent(parent_emt)
for child_emt in child_emt_list:
    print_child(child_emt)

# parent_emt に要素を追加する
new_emt = dom.createElement("child")
new_emt.setAttribute("name", "yoshi")
new_emt.appendChild(dom.createTextNode("hello"))
parent_emt.appendChild(new_emt)

# DOMオブジェクトを文字列にする
ds = dom.toprettyxml("    ")
print
print ds

# DOMオブジェクトをファイルに保存する
with open("xml-file.xml", "w") as f:
    dom.writexml(f, "", "\t", "\n")

実行すると
['parent', {'id': 'top'}]
['child', {'name': 'paul'}, 'Text goes here']
['child', {'name': 'fred'}, 'More text']

<?xml version="1.0" ?>
<parent id="top">
    <child name="paul">
        Text goes here
    </child>
    <child name="fred">
        More text
    </child>
    <child name="yoshi">
        hello
    </child>
</parent>

詳細はドキュメントで

0 件のコメント:

コメントを投稿