Python Xml

本物のページはこちら→python-xml

ElementTreeというパッケージを使う
Python2.5以降には最初から入っているらしい

スタート

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

タグ名から検索

こんなXMLがあったとする

    <location>
      <lat>34.8700000</lat>
      <lng>137.5800000</lng>
    </location>

<lat>の中身をゲットしたかったらこうする
print root.find(".//lat").text
print root.findtext(".//lat")#これでも上と全く同じ結果になる

よくわからないけど、.//をつけなきゃいけないみたいだね。
# -*- coding: cp932 -*-
import xml.etree.ElementTree as ET
tree = ET.parse('sample_ele.xml')
root = tree.getroot()
# attribute名のリスト取得
elelist= root.findall(".//elevation")
for ele in elelist:
    print(ele.text);

かんたんだねーー

タグを相対パスのように検索

print tree.find('/head/title').text
print tree.find('/body/address/div').text
print tree.find('/body/div/p').text

属性名から検索

<cat id="ソラちゃん"></cat>
nodeLink=root.find(".//*[@id='ソラちゃん']");#すべての要素からソラちゃんというIDを持つものを探し当てる

.//の意味をもっと詳しく

相対パスと似たわかりやすい構文である
「XMLから要素や属性、テキストなどを取り出す正規表現のような物」 XPathをご覧下さい。

要素の情報を取得する

属性にアクセス

<element id="miffy">

だったら
xmlnode.attrib["id"]

ファイル名がxml.pyにするとエラー

ふぁい

Traceback (most recent call last):
  File "F:\PolygonRendering\GoogleMapMake\xmltest.py", line 2, in <module>
    import xml.etree.ElementTree as ET
  File "F:\PolygonRendering\GoogleMapMake\xml.py", line 2, in <module>
ImportError: No module named etree.ElementTree

ウェブ上にあるxmlファイルを取得して解析する

# coding: UTF-8
import xml.etree.ElementTree as ET
import sys, urllib2  
from PIL import Image
proxy = {'http':'http://id:pass@url.com:port'}
proxy_handler = urllib2.ProxyHandler(proxy)
auth = urllib2.HTTPBasicAuthHandler()
op=urllib2.build_opener(proxy_handler)  
op.addheaders=[('User-agent', 'Mozilla/5.0')]
tree = ET.parse(op.open('http://maps.googleapis.com/maps/api/elevation/xml?locations=35.843113,139.406984&sensor=false'))
root = tree.getroot()

Elementオブジェクト

find("タグ名")

で取得できます

tag この要素が表すデータの種類を示す文字列です (言い替えると、要素の型です)。
text <タグ名>Text</タグ名>text 属性は要素に結びつけられた付加的なデータを保持するのに使われます。名前が示唆しているようにこの属性は通常文字列ですが、アプリケーション固有のオブジェクトであって構いません。要素が XML ファイルから作られたものならば、この属性は要素タグの間にあるテキストを丸ごと含みます。
tail tail 属性は要素に結びつけられた付加的なデータを保持するのに使われます。この属性は通常文字列ですが、アプリケーション固有のオブジェクトであって構いません。要素が XML ファイルから作られたものならば、この属性は要素の終了タグと次のタグの直前までの間に見つかったテキストを丸ごと含みます。
配列 attrib 要素の属性を保持する辞書です。attrib の値は常に書き換え可能な Python 辞書ですが、ElementTree の実装によっては別の内部表現を使用し、要求されたときにだけ辞書を作るようにしているかもしれません。そうした実装の利益を享受するために、可能な限り下記の辞書メソッドを通じて使用してください。

Elementオブジェクトの関数

取得系

get(key, default=None) 要素の key という名前の属性を取得します。属性の値、または属性がない場合は default を返します。
items() 要素の属性を (名前, 値) ペアのシーケンスとして返します。返される属性の順番は決まっていません。
keys() 要素の属性名をリストとして返します。返される名前の順番は決まっていません。
getchildren() バージョン 3.2 で撤廃: Use list(elem) or iteration.
getiterator(tag=None) バージョン 3.2 で撤廃: Use method Element.iter() instead.

探す系

find(match, namespaces=None) match にマッチする最初の子要素を検索します。match はタグ名または パス を指定できます。要素インスタンスか None を返します。namespaces はオプションで、名前空間接頭辞から完全名を対応付けるマップオブジェクトを指定します。
findall(match, namespaces=None) タグ名または パス にマッチするすべての子要素を検索します。マッチしたすべての子要素が文書内の順序で含まれたリストを返します。namespaces はオプションで、名前空間接頭辞から完全名を対応付けるマップオブジェクトを指定します。
findtext(match, default=None, namespaces=None) match にマッチする最初の子要素のテキストを検索します。match にはタグ名または パス を指定できます。最初にマッチした要素の内容のテキストを返します。マッチする要素が無い場合 default を返します。マッチした要素の内容にテキストがなかった場合空の文字列が返ります。namespaces はオプションで、名前空間接頭辞から完全名を対応付けるマップオブジェクトを指定します。

変更を加える系

追加系

set(key, value) 要素の属性 key に value をセットします。
append(subelement) 要素 subelement を、要素の子要素の内部リストの末尾に追加します。subelement Element でない場合、TypeError を送出します。
extend(subelements) 0 個以上の要素のシーケンスオブジェクトによって subelements を拡張します。subelements が Element でない場合、TypeError を送出します。
insert(index, subelement) 要素内の指定された位置に subelement を挿入します。subelement が Element でない場合、TypeError を送出します。
makeelement(tag, attrib) 現在の要素と同じ型の新しい要素オブジェクトを作成します。このメソッドは呼び出さずに、SubElement() ファクトリ関数を使って下さい。

削除系

clear() 要素をリセットします。子要素をすべて削除します。属性もテキストも、tail attributes to None.
remove(subelement) 要素から subelement を削除します。find* メソッド群と異なり、このメソッドは要素をインスタンスの同一性で比較します。タグや内容では比較しません。

イテレータ系

iter(tag=None) 現在の要素を根とする木の イテレータ を作成します。イテレータは現在の要素とそれ以下のすべての要素を、文書内での出現順 (深さ優先順) でイテレートします。tag が None または '*' でない場合、与えられたタグに等しいものについてのみイテレータから返されます。イテレート中に木構造が変更された場合の結果は未定義です。
iterfind(match, namespaces=None) タグ名または パス にマッチするすべての子要素を検索します。マッチしたすべての要素を文書内での出現順で yield するイテレータを返します。namespaces はオプションで、名前空間接頭辞と完全名を対応付けるマップオブジェクトを指定します。
itertext() テキストのイテレータを作成します。イテレータは、この要素とすべての子要素を文書上の順序で巡回し、すべての内部のテキストを返します。

Element objects also support the following sequence type methods for working with subelements: delitem(), getitem(), setitem(), len().

注意: 子要素を持たない要素の真偽値は False になります。この挙動は将来のバージョンで変更されるかもしれません。直接真偽値をテストするのでなく、len(elem) か elem is None を利用してください。:
http://docs.python.jp/3/library/xml.etree.elementtree.html#element-objects

名前空間の取得の仕方

あれ、名前空間xmlnsって、属性に出てこないじゃん!?と私は焦りましたが、こうやって取得することができます

root.tag#<-「{名前空間名}タグ名」 という文字列になっております

サポートサイト Wikidot.com