Python - XML処理
こんにちは、夢を抱くプログラマーの皆さん!今日は、Pythonを使ったXML処理の素晴らしい世界に飛び込んでいきます。あなたの親しみのある近所のコンピュータサイエンスの先生として、あなたをこの旅のガイドになることができて嬉しいです。それでは、お気に入りの飲み物を片手に、始めましょう!
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つの主要なアプローチは以下の通りです:
- SAX(Simple API for XML)
- DOM(Document Object Model)
- 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