namespaceがあるXMLをPythonで処理する
XMLのnamespace
XMLでは同姓同名の要素に対して異なるnamespaceを割り当てることで名前の衝突を避けることができる。
例えばプログラミング言語のPythonを表す要素pythonと蛇のパイソンを表す要素pythonは以下のように同じXMLで共存することができる。
<cage> <snake:python xmlns:snake="https://www.snake.com/"> <weight>120kg</weight> <age>30</age> </snake:python> <programming:python xmlns:programming="https://www.programming.com/"> <developer>Guido van Rossum</developer> <released>1991</released> </programming:python> </cage>
namespaceの宣言はxmlns属性で行い、プレフィックス (snakeやprogramming)をタグの前に付けている。これで2つのnamespaceが分離して別のものとして扱われる。
Pythonでのnamespaceの扱い方
Element Treeでnamespace付きの要素へアクセスするときには注意が必要だ。
namespaceをdictionaryに格納し、find/findallを実行するときに渡す必要がある。
- namespaceをdictionaryに格納する
namespace = { 'snake': 'https://www.snake.com', 'programming': 'https://www.programming.com' }
- namespace付きの要素へアクセスする
python_snake = root.findall('snake:python', namespace) python_programming = root.findall('programming:python', namespace)