Pythonのxmlパーザ minidom

以前に,xmlからデータの抽出を行う xml.dom.minidom - kensuke-miの日記で,自分で書いたにもかかわらず,また忘れていたので,今回はもう少し書く.

あるコーパスがあって,xmlで保存されているのだが,いろいろと扱いづらい(タグが日本語で記述されている,必要ない情報まで記述されている,そもそもxmlは好きじゃない など)ので,必要な情報のみを抜き出す.

いま,コーパスの方は

        <文 文番号="1001">
        <ペルシア語文> farsi </ペルシア語文>
<日本語訳> ここに日本語訳</日本語訳>
                      <ローマ字>romanized here</ローマ字>
                      </文>


というレイアウトで構成されているとする.
このxmlから,ペルシア語文,日本語訳のみを抜き出すためには,下のスクリプトを使えばいい.

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

import codecs, sys, re, json;
import xml.dom.minidom;

#コーパスの情報を保存しておくための配列
sentence_set_list=[];

file_path='./test.xml';
out_path='test';
document_json=codecs.open(out_path, 'w', 'utf-8');

#minidomを使用して,xmlの解析をする.domにはインスタンスが返される
dom=xml.dom.minidom.parse(file_path);

#getElementsByTagNameメソッドでxmlタグの名前を指定できる.sentence_nodeには,<文>タグと,その子供に関する情報を格納したインスタンスの配列が返される.
sentence_node=dom.getElementsByTagName(u'文');

for node in sentence_node:
    #一文ごとの情報を保存するためのマップ
    sentence_map={};
    #getAttributeメソッドで,要素を獲得できる.
    sentence_id=int(node.getAttribute(u'文番号'));
    sentence_map.setdefault('sentence_id', sentence_id);
    #childNodesメソッドで,子供ノードが格納された配列が返される
    for child in node.childNodes:
        if child.nodeName==u'ペルシア語文':
            #ここはよくわからないが,とにかくテキストデータを取得したければ,こうすればいい
            persian_sentence=child.childNodes[0].data;
            sentence_map.setdefault('persian_sentence', persian_sentence)

        if child.nodeName==u'日本語訳':
            japn_sentence=child.childNodes[0].data;
            sentence_map.setdefault('jpn_sentence', japn_sentence);

    sentence_set_list.append(sentence_map);

#jsonに書き出し
json.dump(sentence_set_list, document_json, indent=4, ensure_ascii=False);


結果,下のjsonファイルを得ることができる.

[
    {
        "persian_sentence": " farsi ", 
        "sentence_id": 1001, 
        "jpn_sentence": " ここに日本語訳", 
        "roman_sentence": " farsi "
    }
]

参考
satomacoto: PythonでXMLを扱う