xmllint学習 #1 サーバーコマンドでxmlをパースできるxmllintが便利っぽい

2019/07/04

xmllint テクノロジー プログラミング 特集

t f B! P L
最近やたらと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仕様になっていて、パースするのが非常に困難です。 次回はこの辺のパースの仕方を学習してみたいと思います。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ