プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

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)