xmllint学習 #2 namespaceを持ったXMLのxpathでのパース方法

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

まったくnamespaceでコントロールするXMLほど扱いにくいものはありません。
 

ネットでも、みんなパースするのに苦労しているようです。
 

でも、SVGもOfficeドキュメントも、東証資料のXBRLも、どれも複数のnamespaceで構成されていて、ここから逃げることはできなさそうです。
 

それなら、ちゃんと向き合ってnamespaceパースをxmllintでできるようにしておきたいと思います。

Officeドキュメントのパース

 

pptxをzip解凍した時になかのスライド情報が入っているデータファイルですが、この中身の<a:t>部分にアタッチしてみたいと思います。
 

まず、ベースのnamespaceにアタッチするには・・・
 

 

root階層からのデータが全て拾えました。
 

さらに、その個階層にあたる”a:t”へのアタッチは・・・
 

 

非常に長いコマンドですが、それぞれのnamespaceにアタッチするたびに”local-name()”と”namespace-uri()”をセットしなければいけません。
 

shellオプション

xmllintはshellオプションという強力なxmlパーサー機能を持っています。
 

簡単に説明すると、xml内の階層を、shellコマンドのように、cd(chenge-directory)したり、内容をcatしたり、することができる言わば対話式にパースすることが出来る機能です。
 

通常の使い方は以下のとおりです。
 

 

以下のようにパイプつなぎで書くこともできます。
※ヘルプの表示

 

ファイル名は意味はないのですが、こうすることで何ができるかがよく分かります。
 

そして、namepaceの対応は以下のようにすると取得できます。
 

 

でも、残念ながら、パイプで繋いでいく方式は、1つのコマンドしかechoで送ることができないので、1ライナーで行う場合は、–xpath方式で行うのが良さそうです。
 

とりあえず、xmlの各要素にアタッチすることができたので、ある程度の作業はできそうですね。

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です