Pythonでxmlオブジェクトを作成してファイルとして保存する方法を紹介します。
1. xmlオブジェクトの作成とファイルの保存
次の例では、国別の都市データを持つxmlオブジェクトを作成してファイルとして保存します。コードを見ると、Root Elementを作成し、その下にSub Elementを追加します。最後に、ElementTreeオブジェクトを作成し、このtreeオブジェクトの内容をファイルとして保存します。
from xml.etree.ElementTree import Element, SubElement, ElementTree
root = Element("Countries")
element1 = Element("Korea")
root.append(element1)
sub_element1 = SubElement(element1, "City")
sub_element1.text = "Seoul"
element2 = Element("Japanese")
root.append(element2)
sub_element2 = SubElement(element2, "City")
sub_element2.text = "Tokyo"
tree = ElementTree(root)
fileName = "example.xml"
with open(fileName, "wb") as file:
tree.write(file, encoding='utf-8', xml_declaration=True)
上記のコードで example.xml
でxmlファイルを保存し、ファイルを確認してみると以下のように保存されています。
<?xml version='1.0' encoding='utf-8'?>
<Countries><Korea><City>Seoul</City></Korea><Japanese><City>Tokyo</City></Japanese></Countries>
見事に変えるとこんな感じです。
<?xml version='1.0' encoding='utf-8'?>
<Countries>
<Korea>
<City>Seoul</City>
</Korea>
<Japanese>
<City>Tokyo</City>
</Japanese>
</Countries>
2. xmlオブジェクトの作成とファイルの保存(Attributeの追加)
1の例は、Elementだけを追加したxml形式でした。以下の例は、Attributeまで追加する例です。 SubElement では、set(attribute, value)
形式で Attribute を追加できます。
from xml.etree.ElementTree import Element, SubElement, ElementTree
root = Element("Countries")
element1 = Element("Korea")
root.append(element1)
sub_element1 = SubElement(element1, "City")
sub_element1.text = "Seoul"
sub_element1.set("attr1", "value1")
sub_element1.set("attr2", "value2")
element2 = Element("Japanese")
root.append(element2)
sub_element2 = SubElement(element2, "City")
sub_element2.text = "Tokyo"
sub_element2.set("attr1", "value1")
sub_element2.set("attr2", "value2")
tree = ElementTree(root)
fileName = "example.xml"
with open(fileName, "wb") as file:
tree.write(file, encoding='utf-8', xml_declaration=True)
example.xml
ファイルを開いてみると、以下のように保存されます。
<?xml version='1.0' encoding='utf-8'?>
<Countries><Korea><City attr1="value1" attr2="value2">Seoul</City></Korea><Japanese><City attr1="value1" attr2="value2">Tokyo</City></Japanese></Countries>
見栄えよく変えれば下記の通りです。
<?xml version='1.0' encoding='utf-8'?>
<Countries>
<Korea>
<City attr1="value1" attr2="value2">Seoul</City>
</Korea>
<Japanese>
<City attr1="value1" attr2="value2">Tokyo</City>
</Japanese>
</Countries>
3. xml 見やすく保存 (Pretty)
1と2の例でファイルを開いてみると、xmlのtextはTabと改行文字の両方を削除し、ファイルのサイズは小さくなりましたが、見た目には良くありませんでした。
xmlのtextにTabと改行文字を追加すると、見栄えの良い保存が可能です。
以下の例は、2の例で _pretty_print(root)
のみを追加しました。 _pretty_print()
は、xml オブジェクトの text に Tab と改行文字を追加し、保存されると見やすく保存されるようにします。
from xml.etree.ElementTree import Element, SubElement, ElementTree
def _pretty_print(current, parent=None, index=-1, depth=0):
for i, node in enumerate(current):
_pretty_print(node, current, i, depth + 1)
if parent is not None:
if index == 0:
parent.text = '\n' + ('\t' * depth)
else:
parent[index - 1].tail = '\n' + ('\t' * depth)
if index == len(parent) - 1:
current.tail = '\n' + ('\t' * (depth - 1))
root = Element("Countries")
element1 = Element("Korea")
root.append(element1)
sub_element1 = SubElement(element1, "City")
sub_element1.text = "Seoul"
sub_element1.set("attr1", "value1")
sub_element1.set("attr2", "value2")
element2 = Element("Japanese")
root.append(element2)
sub_element2 = SubElement(element2, "City")
sub_element2.text = "Tokyo"
sub_element2.set("attr1", "value1")
sub_element2.set("attr2", "value2")
_pretty_print(root)
tree = ElementTree(root)
fileName = "example.xml"
with open(fileName, "wb") as file:
tree.write(file, encoding='utf-8', xml_declaration=True)
example.xml
ファイルを開いてみると、以下のように保存されます。
<?xml version='1.0' encoding='utf-8'?>
<Countries>
<Korea>
<City attr1="value1" attr2="value2">Seoul</City>
</Korea>
<Japanese>
<City attr1="value1" attr2="value2">Tokyo</City>
</Japanese>
</Countries>
4. xmlファイルを読み、見事に出力(1)
次のように、 xml.etree.ElementTree
でxmlファイルを読み込んで出力できます。
import xml.etree.ElementTree as ET
filePath = "./example.xml"
tree = ET.parse(filePath)
ET.dump(tree)
Output:
<Countries><Korea><City>Seoul</City></Korea><Japanese><City>Tokyo</City></Japanese></Countries>
4.1 Tab、改行文字を追加して見事に出力
上記のコードで、 _pretty_print()
をさらに実装して、 xml オブジェクトの text に Tab と改行文字を追加すると次のように見事に出力できます。
import xml.etree.ElementTree as ET
def _pretty_print(current, parent=None, index=-1, depth=0):
for i, node in enumerate(current):
_pretty_print(node, current, i, depth + 1)
if parent is not None:
if index == 0:
parent.text = '\n' + ('\t' * depth)
else:
parent[index - 1].tail = '\n' + ('\t' * depth)
if index == len(parent) - 1:
current.tail = '\n' + ('\t' * (depth - 1))
filePath = "./example.xml"
tree = ET.parse(filePath)
_pretty_print(tree.getroot())
ET.dump(tree)
Output:
<Countries>
<Korea>
<City attr1="value1" attr2="value2">Seoul</City>
</Korea>
<Japanese>
<City attr1="value1" attr2="value2">Tokyo</City>
</Japanese>
</Countries>
5. xmlファイルを読み、見栄えの良い出力(2)
以下のように xml.dom.minidom
を利用してxmlを読み、見やすく出力できます。
import xml.dom.minidom
dom = xml.dom.minidom.parse(fileName)
pretty_xml_as_string = dom.toprettyxml()
print(pretty_xml_as_string)
Output:
<?xml version="1.0" ?>
<Countries>
<Korea>
<City attr1="value1" attr2="value2">Seoul</City>
</Korea>
<Japanese>
<City attr1="value1" attr2="value2">Tokyo</City>
</Japanese>
</Countries>
References
Related Posts
- Python - JSONファイル読み書きする方法
- Python - 平方根の計算方法(Square Root)
- Python - 文字列 特定文字 削除
- Python lower() 文字列を小文字に変換
- Python upper() 文字列を大文字に変換
- Python - ファイル数の確認
- Python - イテレーションステートメントでセット巡回
- Python - 文字列位置(Index)を探す
- Python - ファイルを読み込み、1行ずつリストに保存する
- UbuntuにPython 3.10をインストールする方法
- Python - 関数の定義と呼び出し方法
- Python - ディクショナリーの整理と例
- Python - ディクショナリーの初期化、4つの方法
- Python - XML生成とファイルの保存
- Python - XML解析、タグ、または要素別に読み取る
- Python - 文字列をリストに変換する方法
- Python - 'and'と'&'の違い
- Python - 文字列 切り取り(substring、slicing)
- Python - 'is'と'=='の違い
- PythonでShell Command、スクリプトの実行
- Python - 数字3桁ごとにコンマ(,)を入れる方法
- Python - 辞書をリストに変換
- Python - 文字列から数字のみを抽出する方法
- Python - zipで二つのリスト縛り
- Python - リストを文字列に変換する
- Python - 辞書にキーがあることを確認する
- Python - ファイル、フォルダが存在確認
- Python - floatをintに変更する方法
- Python - リストの最初、最後の 要素を取得する方法
- Python - bytesをStringに変換する方法
- Python - Stringをbytesに変換する方法
- Python - 辞書の重複排除方法
- Python - 二つのリスト一つ併合
- Python - リストの重複排除、4つの方法
- Python - listの先頭にデータを追加する