目的
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 ...