2017-10-21

【Python】JSON形式のデータをXML形式のデータに変換する

目的


PythonでJSON形式のデータを扱うのが難しいので、XML形式に変換して操作をしたい。
そのため、今回はJSONからXMLに変換する方法をまとめる。

方法


ネットで調べたところ、JSONから直接XMLに変換する方法が見つからなかったため、(1)JSON → DICT、(2)DICT → XMLという順番で変換していく。

JSONからDICT型への変換


そもそもJSONとDICTの違いについては、こちらの記事を参照。ほとんど一緒のようだ。

PythonにおいてのJSONファイルの取扱いあれこれ - Qiita

Pythonで作成した出力結果をまとめるのに便利なJSONファイルの紹介です. 後ほど説明しますが,Pythonのリストや辞書形式をそのまま保存できるため, 入出力用の変換がほとんど必要ありません. また,入出力用のimport jsonが入っているので,別ライブラリのインストールは不要です. まず,リストと辞書のことを知っていないと辛いので,書いておきます. ...


jsonファイルを別に保存しておき、jsonファイルを読み込んだ後に、DICT型に変換するという手順をとる。以下実行コード。


#data.json

{
    "honoka": {
        "BWH": [
            78,
            58,
            82
        ],
        "height": 157
    },
    "eri": {
        "BWH": [
            88,
            60,
            84
        ],
        "height": 162
    },
    "kotori": {
        "BWH": [
            80,
            58,
            80
        ],
        "height": 159
    },
    "umi": {
        "BWH": [
            76,
            58,
            80
        ],
        "height": 159
    },
    "rin": {
        "BWH": [
            75,
            59,
            80
        ],
        "height": 155
    },
    "maki": {
        "BWH": [
            78,
            56,
            83
        ],
        "height": 161
    },
    "nozomi": {
        "BWH": [
            90,
            60,
            82
        ],
        "height": 159
    },
    "hanayo": {
        "BWH": [
            82,
            60,
            83
        ],
        "height": 156
    },
    "niko": {
        "BWH": [
            74,
            57,
            79
        ],
        "height": 154
    }
}

#JSONからDICT型への変換

with open('data.json', 'r') as f:
    json_dict = json.load(f) #json -> dict
    print(json_dict)


DICTからXMLへの変換


DICT型からXMLに変換する場合には、dicttoxmlというパッケージを利用する。pipしてパッケージをインストールする。

dicttoxml 1.7.4 : Python Package Index

Converts a Python dictionary or other native data type into a valid XML string.

$ sudo pip install dicttoxml
Collecting dicttoxml
Installing collected packages: dicttoxml
Successfully installed dicttoxml-1.7.4


それで、DICT型のデータを、XMLに出力する


import json
import dicttoxml

with open('data.json', 'r') as f:
    json_dict = json.load(f) #json -> dict
    print(json_dict)
    xml = dicttoxml.dicttoxml(json_dict)
    print(xml)
 

$ python hoge.py

<?xml version="1.0" encoding="UTF-8" ?><root><niko type="dict"><height type="int">154</height><BWH type="list"><item type="int">74</item><item type="int">57</item><item type="int">79</item></BWH></niko><nozomi type="dict"><height type="int">159</height><BWH type="list"><item type="int">90</item><item type="int">60</item><item type="int">82</item></BWH></nozomi><eri type="dict"><height type="int">162</height>


おまけ Beautiful Soupで見やすくしよう


これだけだとみにくいので、見やすくしたい。xml形式のデータを、beautifulsoupにかませて、soup.prettifyメソッドで整列させる。


#
import json
import dicttoxml
from bs4 import BeautifulSoup

with open('data.json', 'r') as f:
    json_dict = json.load(f) #json -> dict
    #print(json_dict)
    xml = dicttoxml.dicttoxml(json_dict)
    #print(xml)
    soup = BeautifulSoup(xml, "xml")
    print(soup.prettify())

$ python hoge.py

<?xml version="1.0" encoding="utf-8"?>
<root>
 <eri type="dict">
  <height type="int">
   162
  </height>
  <BWH type="list">
   <item type="int">
    88
   </item>
   <item type="int">
    60
   </item>
   <item type="int">
    84
   </item>
  </BWH>
 </eri>
 <kotori type="dict">
  <height type="int">
   159
  </height>
  <BWH type="list">
   <item type="int">
    80
   </item>
   <item type="int">
    58
   </item>
   <item type="int">
    80
   </item>
  </BWH>
 </kotori>
 <umi type="dict">
  <height type="int">
   159
  </height>
  <BWH type="list">
   <item type="int">
    76
   </item>
   <item type="int">
    58
   </item>
   <item type="int">
    80
   </item>
  </BWH>
 </umi>
 <rin type="dict">
  <height type="int">
   155
  </height>
  <BWH type="list">
   <item type="int">
    75

なお、それぞれのデータの取得方法に関しては、こちらを参照。

PythonとBeautiful Soupでスクレイピング - Qiita

Pythonでスクレイピングというネタはすでに世の中にもQiitaにもたくさん溢れていますが、なんとなくpyqueryが使いやすいという情報が多い気がします。個人的にはBeautiful Soupの良さも知ってもらいたいと思うのでここではBeautiful Soupを使っていきたいと思います。 ちなみにこのエントリーはほとんどの部分がBeautiful ...

注目の投稿

めちゃくちゃ久しぶりにこのブログ書いたw 更新3年ぶりw > 多様性というゲームは尊厳と自由を勝ち取るゲームなのかもしれないな。  もともとツイッターでツイートした内容なんだけど、ちょっと深ぼる。 ----- 自分は男 x 30代x 二児の父 x 経営者 x 都心(共働き世...