BLOGTIMES
2013/12/05

シェルスクリプトで XML を処理する

  xml  cli  sh 
このエントリーをはてなブックマークに追加

先日、JSON をシェルスクリプトで処理する方法をやりましたが、XML についてもツールがあるのでまとめておきます。

コマンドラインから XML を扱うツールとしては CPAN に XML-XPath*1 というモジュールがあり、これに付属している xpath というコマンドを使う手もあるのですが、出力のフォーマットにあまり融通が利かないので、sed や awk で加工する必要があります。今回はそれがイヤなので、XMLStarlet を使う方法をメモしておきます。

インストール

CentOS であれば yum install xmlstarlet でインストールできます。

使い方

使い方はこんな感じ。 サンプルは以前に使ったもの。

$ echo "<a><b><c>1111</c><d>a1</d></b><b><c>2222</c><d>a2</d></b></a>" | xmlstarlet sel -t -v "//b[./c/text() = '2222']/d" a2 $ echo "<a><b><c>1111</c><d>a1</d></b><b><c>2222</c><d>a2</d></b></a>" | xmlstarlet sel -t -m "//c" -v "concat(position(),':',.,'&#xa;')" 1:1111 2:2222

-m でノードを選択して、-v (--value-of) で表示するという感じになります。
XPath や XSL に馴染んでいればかなりカスタマイズが利くので便利です。

XSLT 出力でさらにカスタマイズ

さらに -C オプションをつけると変換に使った XSLT を表示させることができます。
これを元にさらにカスタマイズした出力を行う事も簡単にできますね。

$ echo "<a><b><c>1111</c><d>a1</d></b><b><c>2222</c><d>a2</d></b></a>" | xmlstarlet sel -C -t -m "//c" -v "concat(position(),':',.,'&#xa;')" <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" xmlns:math="http://exslt.org/math" xmlns:date="http://exslt.org/dates-and-times" xmlns:func="http://exslt.org/functions" xmlns:set="http://exslt.org/sets" xmlns:str="http://exslt.org/strings" xmlns:dyn="http://exslt.org/dynamic" xmlns:saxon="http://icl.com/saxon" xmlns:xalanredirect="org.apache.xalan.xslt.extensions.Redirect" xmlns:xt="http://www.jclark.com/xt" xmlns:libxslt="http://xmlsoft.org/XSLT/namespace" xmlns:test="http://xmlsoft.org/XSLT/" extension-element-prefixes="exslt math date func set str dyn saxon xalanredirect xt libxslt test" exclude-result-prefixes="math str"> <xsl:output omit-xml-declaration="yes" indent="no"/> <xsl:param name="inputFile">-</xsl:param> <xsl:template match="/"> <xsl:call-template name="t1"/> </xsl:template> <xsl:template name="t1"> <xsl:for-each select="//c"> <xsl:value-of select="concat(position(),':',.,'&#xa;')"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>

トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6313
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン