dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

python で XML を SAX でパーズ

2022-05-06 23:33:31 | python
python で XML を SAX でパーズして、JSONL で出力します。
■XML
<?xml version=&quote;1.0&quote;?>
<items>
  <item id=&quote;item1&quote;>
    <title>商品1</title>
    <price>100</price>
  </item>
  <item id=&quote;item2&quote;>
    <title>商品2</title>
    <price>500</price>
  </item>
  <item id=&quote;item3&quote;>
    <title>商品3</title>
    <price>1000</price>
  </item>
</items>

■プログラム
startElement() には開始タグを読み取った際の処理を記述し、
endElement() には終了タグを読み取った際の処理を記述します。
そして、characters() にはタグ内の文字列を読み取った際の処理を記述します。
import sys
import json
import xml.sax
import xml.sax.handler

class XmlToJsonHandler(xml.sax.handler.ContentHandler):
    def __init__(self):
        self.tags = []
        self.item = None

    def create_item(self):
        item = {
            'id': '',
            'title': '',
            'price': '',
        }
        return item

    def create_tag(self, name, attrs):
        tag = {
            'name': name,
            'attrs': attrs,
        }
        return tag

    def startElement(self, name, attrs):
        tag = self.create_tag(name, attrs)
        self.tags.append(tag)

        if name == 'item':
            self.item = self.create_item()
            self.item['id'] = attrs.get('id')

    def endElement(self, name):
        self.tags.pop()
        if name == 'item':
            print(json.dumps(self.item, ensure_ascii=False))

    def characters(self, text):
        name = self.tags[-1]['name']
        if name == 'title':
            self.item[name] = text
        elif name == 'price':
            self.item[name] = int(text)

def main():
    parser = xml.sax.make_parser()
    parser.setContentHandler(XmlToJsonHandler())
    parser.parse(sys.stdin)
    return 0

if __name__== '__main__':
    res = main()
    exit(res)

■実行結果
上記の XML は以下の JSONL に変換されます。
{"id": "item1", "title": "商品1", "price": 100}
{"id": "item2", "title": "商品2", "price": 500}
{"id": "item3", "title": "商品3", "price": 1000}

この記事についてブログを書く
« apache beam でマルチプロセ... | トップ | apache beam によるパイプラ... »

python」カテゴリの最新記事