Python - XML解析、タグ、または要素別に読み取る

PythonでXMLファイルや文字列を解析し、TagやattributeごとにElementを読み取る方法を紹介します。

1. XMLファイルの解析

ElementTree.parse(file) は引数に渡されたファイルを解析し、ElementTree オブジェクトに返します。

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>

1.1 解析したオブジェクトを見やすく出力:Textに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>

2. XML文字列解析

ElementTree.fromstring()はXML文字列を引数として受け取り、解析した結果をElementオブジェクトに返します。

import xml.etree.ElementTree as ET


xml_str = "<Countries><Korea><City>Seoul</City></Korea><Japanese><City>Tokyo</City></Japanese></Countries>"

element = ET.fromstring(xml_str)
ET.dump(element)

Output:

<Countries><Korea><City>Seoul</City></Korea><Japanese><City>Tokyo</City></Japanese></Countries>

3. XML解析し、要素ごとに読み込む

次のようにXMLを解析してElementオブジェクトを取得し、要素ごとにアクセスできます。 findall()ですべてのタグを見つけることができ、 attribでElementのattributeにアクセスできます。 XMLのテキストは textでアクセスできます。 Element の子 Element は find()findall() でアクセスできます。

import xml.etree.ElementTree as ET


xml_str = '''<?xml version='1.0' encoding='utf-8'?>
<Countries>
    <Country name="Korea">
        <City attr1="value1" attr2="value2">Seoul</City>
    </Country>
    <Country name="Japanese">
        <City attr1="value1" attr2="value2">Tokyo</City>
    </Country>
</Countries>
'''

root = ET.fromstring(xml_str)

for country in root.findall("Country"):
    attr = country.attrib
    name = attr.get("name")
    city = country.find("City")
    city_name = city.text
    city_attr1 = city.attrib.get("attr1")
    city_attr2 = city.attrib.get("attr2")
    print(f"attr : {attr}")
    print(f"name : {name}")
    print(f"attr : {attr}")
    print(f"city_name : {city_name}")
    print(f"city_attr1 : {city_attr1}")
    print(f"city_attr2 : {city_attr2}")

Output:

attr : {'name': 'Korea'}
name : Korea
attr : {'name': 'Korea'}
city_name : Seoul
city_attr1 : value1
city_attr2 : value2
attr : {'name': 'Japanese'}
name : Japanese
attr : {'name': 'Japanese'}
city_name : Tokyo
city_attr1 : value1
city_attr2 : value2

Related Posts

codechachaCopyright ©2019 codechacha