Python XML ファイル – 読み方、書き方、解析方法

⚡ スマートサマリー

Python XML処理では、組み込みのminidomおよびElementTreeモジュールを使用してXMLドキュメントの読み書きと解析を行うことができます。minidomクラスはファイルをDOMとしてメモリにロードし、ElementTreeはより高速で、より Pythonic tree API。

  • 🔘 XMLとは何か: 拡張マークアップ言語(eXML)は、小規模で構造化されたデータを保存および転送します。
  • ☑️ minidomの解析: parse() 関数は、XML ファイルを DOM としてメモリに読み込みます。
  • 読書タグ: getElementsByTagName() は一致する要素を返し、getAttribute() はそれらの値を読み取ります。
  • 🧪 ノードの書き込み: createElement() と appendChild() は、ドキュメントに新しいタグを追加します。
  • 🛠️ ElementTree API: ET.parse() はツリーを構築し、getroot() はルート要素を返します。
  • 🤖 AI対応準備完了: 解析されたXMLは、設定データとAPIデータを機械学習パイプラインに供給します。

Python XMLファイル

以下のセクションでは、XML ファイルの解析、書き込み、および読み込みについて説明します。 Python.

XMLとは何ですか?

XML は eXtensible Markup Language の略です。 小規模から中量のデータを保存および転送するように設計されており、構造化情報の共有に広く使用されています。

Python XML ドキュメントを解析および変更することができます。XML ドキュメントを解析するには、XML ドキュメント全体をメモリに保持する必要があります。このチュートリアルでは、XML minidom クラスを次のように使用する方法を見ていきます。 Python XML ファイルを読み込んで解析します。

minidom を使用して XML を解析する方法

解析するサンプル XML ファイルを作成しました。

ステップ 1) サンプル XML ファイルを作成する

ファイル内には、名前、姓、自宅、専門分野(SQL、 Python(テストおよびビジネス)。

minidom を使用して XML を解析する方法

ステップ 2) 解析関数を使用して XML ファイルをロードおよび解析します

ドキュメントの解析が完了したら、ドキュメントのルートの「ノード名」と「最初の子タグ名」を出力します。タグ名とノード名は、XMLファイルの標準的なプロパティです。

minidom を使用して XML を解析する

  • xml.dom.minidomモジュールをインポートし、解析対象のファイル(myxml.xml)を宣言します。
  • このファイルには、姓、名、自宅、専門知識など、従業員に関する基本情報が含まれています。
  • XML Minidom の parse 関数を使用して、XML ファイルをロードして解析します。
  • 変数docがあり、docにはparse関数の結果が格納されます。
  • ファイルからノード名と子タグ名を出力したいので、print関数内で宣言します。
  • コードを実行します。XML ファイルからノード名 (#document) と XML ファイルから最初の子タグ名 (employee) が出力されます。

お願い: ノード名と子タグ名は、XML DOM の標準的な名前またはプロパティです。

ステップ3)XMLドキュメントからXMLタグのリストを呼び出し、それを印刷する

次に、XML ドキュメントから XML タグのリストを呼び出して出力することもできます。ここでは、SQL などのスキルセットを出力しました。 Python, テスト そしてビジネス。

minidom を使用して XML を解析する

  • これから使用する変数「expertification」を宣言します。trac従業員が持つ専門知識の名前をすべて挙げる
  • 「getElementsByTagName」という dom 標準関数を使用します。
  • これにより、スキルという名前のすべての要素が取得されます
  • 各スキルタグに対してループを宣言します
  • コードを実行すると、4つのスキルの一覧が表示されます。

XMLノードの書き方

「createElement」関数を使用して新しい属性を作成し、この新しい属性またはタグを既存の XML タグに追加できます。 XML ファイルに新しいタグ「BigData」を追加しました。

  1. 既存の XML タグに新しい属性 (BigData) を追加するには、コードを記述する必要があります。
  2. 次に、新しい属性が既存のXMLタグに追加されたXMLタグを出力する必要があります。

XMLノードの書き込み

  • 新しいXMLタグを追加してドキュメントに追加するには、「doc.createElement」というコードを使用します。
  • このコードは、新しい属性「ビッグデータ」に対応する新しいスキルタグを作成します。
  • このスキルタグをドキュメントの最初の子要素(従業員)に追加してください。
  • コードを実行すると、他の専門分野のリストに新しいタグ「BigData」が表示されます。

XML パーサーの例

Python 2例

import xml.dom.minidom

def main():
# use the parse() function to load and parse an XML file
   doc = xml.dom.minidom.parse("Myxml.xml");
  
# print out the document node and the name of the first child tag
   print doc.nodeName
   print doc.firstChild.tagName
  
# get a list of XML tags from the document and print each one
   expertise = doc.getElementsByTagName("expertise")
   print "%d expertise:" % expertise.length
   for skill in expertise:
     print skill.getAttribute("name")
    
#Write a new XML tag and add it into the document
   newexpertise = doc.createElement("expertise")
   newexpertise.setAttribute("name", "BigData")
   doc.firstChild.appendChild(newexpertise)
   print " "

   expertise = doc.getElementsByTagName("expertise")
   print "%d expertise:" % expertise.length
   for skill in expertise:
     print skill.getAttribute("name")
    
if name == "__main__":
  main();

Python 3例

import xml.dom.minidom

def main():
    # use the parse() function to load and parse an XML file
    doc = xml.dom.minidom.parse("Myxml.xml");

    # print out the document node and the name of the first child tag
    print (doc.nodeName)
    print (doc.firstChild.tagName)
    # get a list of XML tags from the document and print each one
    expertise = doc.getElementsByTagName("expertise")
    print ("%d expertise:" % expertise.length)
    for skill in expertise:
        print (skill.getAttribute("name"))

    # Write a new XML tag and add it into the document
    newexpertise = doc.createElement("expertise")
    newexpertise.setAttribute("name", "BigData")
    doc.firstChild.appendChild(newexpertise)
    print (" ")

    expertise = doc.getElementsByTagName("expertise")
    print ("%d expertise:" % expertise.length)
    for skill in expertise:
        print (skill.getAttribute("name"))

if __name__ == "__main__":
    main();

ElementTree を使用して XML を解析する方法

ElementTreeはXMLを操作するためのAPIです。ElementTreeを使えば、XMLファイルを簡単に処理できます。

サンプル データとして次の XML ドキュメントを使用します。

<data>
   <items>
      <item name="expertise1">SQL</item>
      <item name="expertise2">Python</item>
   </items>
</data>

ElementTree を使用して XML を読み取る:

まず、xml.etree.ElementTreeモジュールをインポートする必要があります。

import xml.etree.ElementTree as ET

それでは、ルート要素を取得しましょう。

root = tree.getroot()

以下は、上記のXMLデータを読み込むための完全なコードです。

import xml.etree.ElementTree as ET
tree = ET.parse('items.xml')
root = tree.getroot()

# all items data
print('Expertise Data:')

for elem in root:
   for subelem in elem:
      print(subelem.text)

出力:

Expertise Data:
SQL
Python

よくあるご質問

DOMナビゲーションが必要な小さなファイルにはminidomを使用してください。ほとんどの作業にはElementTreeを選択してください。ElementTreeはより高速で軽量であり、推奨されています。 Pythonic デフォルト。

ルートを ElementTree でラップし、tree.write(“out.xml”, encoding=”utf-8″, xml_declaration=True) を呼び出します。インデントには ET.indent() を使用します。 Python 3.9以降、またはlxmlのpretty_print。

lxmlは、ElementTree APIを共有するサードパーティライブラリですが、高速なC言語コードで構築されています。XPath、XSLT、および検証機能が追加されています。pip install lxmlでインストールしてください。

標準のパーサーはXXE攻撃やbillion-laughs攻撃に対して脆弱です。defusedxmlをインストールし、defusedxml.ElementTreeをインポートしてください。これは危険な外部エンティティを無効にするドロップイン代替ライブラリです。

はい。minidom.parseString(text) または ElementTree の ET.fromstring(text) を使用してください。ET.fromstring(text) はルートを直接返します。どちらも変数から XML を解析するため、レスポンスを事前に保存する必要はありません。

ElementTree を使用してツリー構造を走査し、各要素のタグ、属性、テキストから辞書を作成します。xmltodict ライブラリは、xmltodict.parse() を介して変換を自動化します。

XML には、モデルにフィードする設定、注釈、および API レスポンスが格納されます。Pascal VOC イメージラベルは XML として出荷されます。ElementTree は、tracトレーニング用のバウンディングボックスです。

はい。GitHub Copilotは、parse()やfindall()ループなどのminidomおよびElementTreeパターンを自動補完します。ただし、タグ名とエンコーディングは引き続き検証し、信頼できない入力にはdefusedxmlを追加してください。