Python - XML処理

こんにちは、夢を抱くプログラマーの皆さん!今日は、Pythonを使ったXML処理の素晴らしい世界に飛び込んでいきます。あなたの親しみのある近所のコンピュータサイエンスの先生として、あなたをこの旅のガイドになることができて嬉しいです。それでは、お気に入りの飲み物を片手に、始めましょう!

Python - XML Processing

XMLとは?

コーディングに飛び込む前に、まずXMLが何であるかを理解しましょう。XMLはeXtensible Markup Languageの略で、拡張可能なマークアップ言語です。それはHTMLのいとこみたいな存在で、異なる目的を持っています。HTMLはデータの表示に使用される一方、XMLはデータの保存と運輸に使用されます。

XMLを、情報をツリー構造で整理する方法と考えてください。それはタグ(例:<tag>)を使用して要素を定義します。これは、あなたがコンピュータ上のファイルをフォルダーに整理するのに似ています。

以下はXMLの簡単な例です:

<bookstore>
<book>
<title>Harry Potter</title>
<author>J.K. Rowling</author>
<year>1997</year>
</book>
</bookstore>

この例では、本屋に本の情報が含まれています。この本には、タイトル、著者、発行年があります。簡単でしょう?

XMLパーサーアーキテクチャとAPI

XMLが何か理解したので、Pythonでどのようにそれを扱うかを話しましょう。PythonはXMLデータをパース(読み取りと解釈)するためのいくつかの方法を提供します。3つの主要なアプローチは以下の通りです:

  1. SAX(Simple API for XML)
  2. DOM(Document Object Model)
  3. ElementTree

これらそれぞれには、独自の強みと使用例があります。それぞれを一つずつ探っていきましょう!

SAX APIを使ったXMLのパース

SAX、またはSimple API for XMLは、イベント駆動型のパーサーです。それはXMLファイルを順次読み込み、要素、属性、テキストに遭遇したときにイベントをトリガーします。

以下はSAXをPythonで使用する簡単な例です:

import xml.sax

class BookHandler(xml.sax.ContentHandler):
def startElement(self, name, attrs):
self.current = name
def characters(self, content):
if self.current == "title":
print(f"Book title: {content}")

handler = BookHandler()
parser = xml.sax.make_parser()
parser.setContentHandler(handler)
parser.parse("books.xml")

この例では、BookHandlerクラスを作成し、パーサーがXMLの異なる部分に遭遇したときに何をするかを定義します。タイトルの要素を見つけた場合、タイトルを表示します。

DOM APIを使ったXMLのパース

DOM、またはDocument Object Modelは、XML文書全体をメモリに読み込み、ツリー構造で表現します。これにより、文書のナビゲーションや変更が容易になります。

以下はDOMをPythonで使用する方法です:

import xml.dom.minidom

doc = xml.dom.minidom.parse("books.xml")
titles = doc.getElementsByTagName("title")
for title in titles:
print(f"Book title: {title.firstChild.data}")

このコードは、XMLファイルをパースし、すべての"タイトル"要素を見つけて、その内容を表示します。

ElementTree XML API

ElementTreeは、より軽量でよりPythonらしい方法でXMLを扱う方法です。そのシンプルさと効率性のために、多くのPython開発者によって好まれています。

以下はElementTreeを使用する例です:

import xml.etree.ElementTree as ET

tree = ET.parse("books.xml")
root = tree.getroot()

for book in root.findall("book"):
title = book.find("title").text
print(f"Book title: {title}")

このコードは、前の例と同じことをより簡単に行います。

XMLファイルの作成

次に、ElementTreeを使って新しいXMLファイルを作成してみましょう:

import xml.etree.ElementTree as ET

root = ET.Element("bookstore")
book = ET.SubElement(root, "book")
ET.SubElement(book, "title").text = "The Hitchhiker's Guide to the Galaxy"
ET.SubElement(book, "author").text = "Douglas Adams"
ET.SubElement(book, "year").text = "1979"

tree = ET.ElementTree(root)
tree.write("new_books.xml")

このスクリプトは、本のエントリーを含む新しいXMLファイルを作成します。それは、本を書くのではなく、XMLを書く作者みたいなものです!

XMLファイルのパース

すでにXMLファイルのパースの例を見ていますが、ElementTreeを使ったもっと包括的な例を見てみましょう:

import xml.etree.ElementTree as ET

tree = ET.parse("books.xml")
root = tree.getroot()

for book in root.findall("book"):
title = book.find("title").text
author = book.find("author").text
year = book.find("year").text
print(f"'{title}' by {author}, published in {year}")

このスクリプトは、私たちのXMLファイルを読み込み、各本の情報をフォーマットして表示します。

既存のXMLファイルの変更

最後に、既存のXMLファイルを変更してみましょう:

import xml.etree.ElementTree as ET

tree = ET.parse("books.xml")
root = tree.getroot()

for book in root.findall("book"):
year = int(book.find("year").text)
if year < 2000:
book.find("year").text = str(year + 100)

tree.write("modified_books.xml")

このスクリプトは、2000年以前に出版された本の発行年に100年を加えます。まるで私たちがこれらの本を未来に送っているみたいです!

以下は、私たちが使用した主要なメソッドをまとめた表です:

メソッド 説明
ET.parse() XMLファイルをパース
ET.Element() 新しい要素を作成
ET.SubElement() 新しい子要素を作成
element.findall() 一致するサブ要素をすべて見つける
element.find() 最初に一致するサブ要素を見つける
element.text 要素のテキストを取得または設定
tree.write() XMLツリーをファイルに書き込む

それでは、これでPythonでのXML処理の基本をカバーしました。覚えるのは実践です。これらの例を実験してみてください。XMLは最初は少し恐ろしくなるかもしれませんが、慣れると構造化データを扱うための強力なツールになります。

プログラミングの楽しさをお楽しみください、未来のXMLマスターたち! ??

Credits: Image by storyset