Python で XML パーサーを作成する

Vaibhhav Khetarpal 2023年10月10日
  1. Python で ElementTree API を使用して XML ドキュメントを解析する
  2. Python で minidom モジュールを使用して XML ドキュメントを解析する
  3. Python で Beautiful Soup ライブラリを使用して XML ドキュメントを解析する
  4. Python で xmltodict ライブラリを使用して XML ドキュメントを解析する
  5. Python で lxml ライブラリを使用して XML ドキュメントを解析する
  6. Python で untangle モジュールを使用して XML ドキュメントを解析する
  7. Python で declxml ライブラリを使用して XML ドキュメントを解析する
Python で XML パーサーを作成する

XML は、eXtensible Markup Language の略語であり、データの保存と転送に使用される自己記述型言語です。Python は、XML ドキュメントを解析および変更するための媒体を提供します。

このチュートリアルでは、Python で XML ドキュメントを解析するためのさまざまな方法に焦点を当てて説明します。

Python で ElementTree API を使用して XML ドキュメントを解析する

xml.etree.ElementTree モジュールは、XML ドキュメントを解析して XML データを作成するための効率的でシンプルな API を生成するために使用されます。

次のコードは、xml.etree.ElementTree モジュールを使用して Python で XML ドキュメントを解析します。

# >= Python 3.3 code
import xml.etree.ElementTree as ET

file1 = """<foo>
           <bar>
               <type foobar="Hello"/>
               <type foobar="God"/>
          </bar>
       </foo>"""
tree = ET.fromstring(file1)
x = tree.findall("bar/type")
for item in x:
    print(item.get("foobar"))

出力:

Hello
God

ここでは、XML データを三重引用符で囲んだ文字列として渡します。ElementTree モジュールの parse() 関数を使用して、実際の XML ドキュメントをインポートすることもできます。

cElementTree モジュールは ElementTree API の C 実装でしたが、唯一の違いは cElementTree が最適化されていることです。そうは言っても、ElementTree モジュールよりも約 15〜20 倍速く解析でき、使用するメモリ量は非常に少なくなります。

ただし、Python 3.3 以降では、cElementTree モジュールは非推奨になり、ElementTree モジュールはより高速な実装を使用します。

Python で minidom モジュールを使用して XML ドキュメントを解析する

xml.dom.minidom は、ドキュメントオブジェクトモデル(DOM)インターフェイスの基本的な実装として定義できます。すべての DOM アプリケーションは通常、XML オブジェクトの解析から始まります。したがって、このメソッドは、Python で XML ドキュメントを解析するための最も速いメソッドです。

次のコードは、minidom モジュールの parse() 関数を使用して、Python で XML ドキュメントを解析します。

XML ファイル(sample1.xml):

<data>
    <strings>
        <string name="Hello"></string>
        <string name="God"></string>
    </strings>
</data>

Python コード:

from xml.dom import minidom

xmldoc = minidom.parse("sample1.xml")
stringlist = xmldoc.getElementsByTagName("string")
print(len(stringlist))
print(stringlist[0].attributes["name"].value)
for x in stringlist:
    print(x.attributes["name"].value)

出力:

2
Hello
God

このモジュールでは、ElementTree API と同様に、XML を文字列として渡すこともできます。ただし、これを実現するために parseString() 関数を使用します。

xml.etree.ElementTree モジュールと xml.dom.minidom モジュールはどちらも、悪意を持って構築されたデータに対して安全ではないと言われています。

Python で Beautiful Soup ライブラリを使用して XML ドキュメントを解析する

Beautiful Soup ライブラリは、プロジェクトを Web スクレイピングし、XML および HTML ファイルからデータを引き出すために設計されています。Beautiful Soup は非常に高速で、遭遇したものをすべて解析できます。

このライブラリは、プログラムのツリー走査プロセスも実行し、XML ドキュメントを解析します。さらに、Beautiful Soup は、特定のソースコードを美しくするためにも使用されます。

Beautiful Soup ライブラリは手動でインストールしてから、このメソッドの Python コードにインポートする必要があります。このライブラリは、pip コマンドを使用してインストールできます。最新バージョンである Beautiful Soup 4 ライブラリは、Python 2.7 以降で動作します。

次のコードは、Beautiful Soup ライブラリを使用して Python で XML ドキュメントを解析します。

from bs4 import BeautifulSoup

file1 = """<foo>
   <bar>
      <type foobar="Hello"/>
      <type foobar="God"/>
   </bar>
</foo>"""

a = BeautifulSoup(file1)
print(a.foo.bar.type["foobar"])
print(a.foo.bar.findAll("type"))

出力:

u'Hello'
[<type foobar="Hello"></type>, <type foobar="God"></type>]

Beautiful Soup は、構文解析に使用される他のどのツールよりも高速ですが、このメソッドを理解して実装するのが難しい場合があります。

Python で xmltodict ライブラリを使用して XML ドキュメントを解析する

xmltodict ライブラリは、JSON のプロセスと同様の XML ファイルでのプロセスの作成に役立ちます。XML ファイルを解析する場合にも使用できます。この場合、xmltodict モジュールは、XML ファイルを Ordered Dictionary に解析することで利用できます。

xmltodict ライブラリは手動でインストールしてから、XML ファイルを含む Python コードにインポートする必要があります。xmltodict のインストールは非常に基本的であり、標準の pip コマンドを使用して実行できます。

次のコードは、xmltodict ライブラリを使用して Python で XML ドキュメントを解析します。

import xmltodict

file1 = """<foo>
             <bar>
                 <type foobar="Hello"/>
                 <type foobar="God"/>
             </bar>
        </foo> """
result = xmltodict.parse(file1)
print(result)

出力:

OrderedDict([(u'foo', OrderedDict([(u'bar', OrderedDict([(u'type', [OrderedDict([(u'@foobar', u'Hello')]), OrderedDict([(u'@foobar', u'God')])])]))]))])

Python で lxml ライブラリを使用して XML ドキュメントを解析する

lxml ライブラリは、XML および HTML ファイルの解析に使用される Python でシンプルでありながら非常に強力な API を提供できます。ElementTree API と libxml2/libxslt を組み合わせています。

簡単に言うと、lxml ライブラリは古い ElementTree ライブラリをさらに拡張して、XML スキーマ、XPath、XSLT などのはるかに新しいものをサポートします。

ここでは、lxml.objectify ライブラリを使用します。次のコードは、lxml ライブラリを使用して Python で XML ドキュメントを解析します。

from collections import defaultdict
from lxml import objectify

file1 = """<foo>
                <bar>
                    <type foobar="1"/>
                    <type foobar="2"/>
                </bar>
            </foo>"""

c = defaultdict(int)

root = objectify.fromstring(file1)

for item in root.bar.type:
    c[item.attrib.get("foobar")] += 1

print(dict(c))

出力:

{'1': 1, '2': 1}

ここで、このプログラムでは、c 変数を使用して、辞書で使用可能な各アイテムの数を格納します。

Python で untangle モジュールを使用して XML ドキュメントを解析する

untangle モジュールは、XML を Python オブジェクトに変換することに焦点を当てた実装が簡単なモジュールです。pip コマンドを使用して簡単にインストールすることもできます。このモジュールは Python 2.7 以降で動作します。

次のコードは、untangle モジュールを使用して Python で XML ドキュメントを解析します。

XML ファイル(sample1.xml):

<foo>
   <bar>
      <type foobar="Hello"/>
   </bar>
</foo>

Python コード:

import untangle

x = untangle.parse("/path_to_xml_file/sample1.xml")
print(x.foo.bar.type["foobar"])

出力:

Hello

Python で declxml ライブラリを使用して XML ドキュメントを解析する

宣言型 XML 処理の略語である declxml ライブラリは、XML ドキュメントをシリアル化および解析するための単純な API を提供するために使用されます。このライブラリは、プログラマーの作業負荷を軽減し、minidomElementTree などの他の一般的な API を使用するときに必要な解析ロジックのコードの大きくて長いチャンクを通過する必要性を置き換えることを目的としています。

declxml モジュールは、pip または pipenv コマンドを使用してシステムに簡単にインストールできます。次のコードは、declxml ライブラリを使用して Python で XML ドキュメントを解析します。

import declxml as xml

xml_string = """
<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="3"/>
      <type foobar="5"/>
   </bar>
</foo>
"""

processor = xml.dictionary(
    "foo", [xml.dictionary("bar", [xml.array(xml.integer("type", attribute="foobar"))])]
)

xml.parse_from_string(processor, xml_string)

出力:

{'bar': {'foobar': [1, 3, 5]}}

この方法では、プロセッサを使用して、特定の XML ドキュメントの構造を宣言的に特徴付け、XML と Python のデータ構造をマッピングします。

Vaibhhav Khetarpal avatar Vaibhhav Khetarpal avatar

Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.

LinkedIn

関連記事 - Python XML