最近やたらとXMLデータを扱う事が多い。
いいかげんJSONベースで楽にさせてくれと思っているのに、大企業や政府はXMLが大好きらしい。
もちろん、機能が豊富なのは分かるが、namespaceとか、エンジニアからしてみるとめんどくさくて仕方がないシロモノ。
そして、xmlはこれまでphpでわざわざパースしていたんですが、「xmllint」っていうサーバーコマンドでパースできるっているモノがあるらしいじゃないですか・・・
ググればすぐに目につくのに、なんでこれまで気が付かなかったんだろう!!!
そんなワケで、xmllintを使いこなせるようになりたいので、コマンドに使い慣れてみたいと思い、勉強がてら記事を書いておこうと思います。
xmllintのインストール確認
事前にインストールされているか確認してみる。
$ which xmllint
/usr/bin/xmllint
どうやらかなり老舗のツールのようなので、ほぼインストール操作をしなくても、Linuxサーバーには入っているぐらいの標準ツールみたいですが、dockerのミニマムインストールされた環境には入っていない事が多いので、下記の方法でインストールすることができた。
# debian系(ubuntu)
$ apt-get install libxml2-utils
インストール名ではなく、ライブラリの中に入っているツールなんですね。
これはもはや、windowsOSのIEと同じような位置づけと同じじゃないかと思ってしまった・・・
サンプルXMLを使って簡単パース
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<hoge>
<hage name="aaa" value="12345" >DOG</hage>
<hage name="bbb" value="56789" >CAT</hage>
</hoge>
# 内部データの構造一覧表示
$ xmllint sample.xml --format
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<hoge>
<hage name="aaa" value="12345">DOG</hage>
<hage name="bbb" value="56789">CAT</hage>
</hoge>
# hageタグを取得を取得
$ xmllint sample.xml --xpath "//hage"
<hage name="aaa" value="12345">DOG</hage><hage name="bbb" value="56789">CAT</hage>
# "aaa"属性をもったタグを取得
$ xmllint sample.xml --xpath "//hage[@name='aaa']"
<hage name="aaa" value="12345">DOG</hage>
参考
xpathの使い方をまとめてくれています。
svgもパースできる
フリー素材などでお手軽にダウンロードできて、WEBページで便利に活用できるSVGは中身はXMLデータです。
中身も簡単に表示できて、パースして内容変更することも可能です。
$ xmllint alert.svg --format
<?xml version="1.0"?>
<!--?xml version="1.0" encoding="utf-8"?-->
<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="_x32_" x="0px" y="0px" width="512px" height="512px" viewBox="0 0 512 512" style="width: 128px; height: 128px; opacity: 1;" xml:space="preserve">
<style type="text/css">
.st0{fill:#4B4B4B;}
</style>
<g>
<path class="st0" d="M452.938,19.112c-3.219-2.109-7.281-2.469-10.813-0.953L188.641,127.034l-0.016,194.282l253.5,108.891 c3.531,1.516,7.594,1.156,10.813-0.969s5.156-5.703,5.156-9.563V28.69C458.094,24.831,456.188,21.221,452.938,19.112z"/>
<path class="st0" d="M167.063,127.034H45.844c-25.313,0-45.828,20.516-45.828,45.828L0,275.472 c0,25.328,20.531,45.844,45.844,45.844h121.219V127.034z"/>
<path class="st0" d="M475.625,186.44v86.25c15.625,0,36.375-19.313,36.375-43.11C512,205.752,491.25,186.44,475.625,186.44z"/>
<path class="st0" d="M147.969,342.753H66.031L99.656,478.44c1.844,9.5,10.156,16.328,19.813,16.328h46.578 c6.359,0,12.359-3,16.172-8.125c3.828-5.094,5-11.703,3.188-17.813L147.969,342.753z"/>
</g>
</svg>
ただし、SVGの仕様についてはここでは解説しません・・・
やっかいなnamespace
他にもOffice系ファイルも中身は"zip > xml"なので、xmllintでコントロールすることが可能です。
・・・が・・・・
ゴリゴリのnamespace仕様になっていて、パースするのが非常に困難です。
次回はこの辺のパースの仕方を学習してみたいと思います。
0 件のコメント:
コメントを投稿