python で XML を SAX でパーズして、JSONL で出力します。
■XML
■プログラム
startElement() には開始タグを読み取った際の処理を記述し、
endElement() には終了タグを読み取った際の処理を記述します。
そして、characters() にはタグ内の文字列を読み取った際の処理を記述します。
■実行結果
上記の XML は以下の JSONL に変換されます。
{"id": "item1", "title": "商品1", "price": 100}
{"id": "item2", "title": "商品2", "price": 500}
{"id": "item3", "title": "商品3", "price": 1000}
■XML
<?xml version="e;1.0"e;?> <items> <item id="e;item1"e;> <title>商品1</title> <price>100</price> </item> <item id="e;item2"e;> <title>商品2</title> <price>500</price> </item> <item id="e;item3"e;> <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}