XML (SVG) からファイル名を抜き出す

Get a list of delimited filenames from a text file - Stack Overflow からですが、XML ファイルを通常の awk で扱うのはフォーマットが固定されていれば問題ないのですが、改行がどこにあるのか把握できない場合には危険です。 そうした場合には、xgawk を用います。

ここでは以下のような sample.xml を用います。

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 13.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 width="471.677px" height="126.604px" viewBox="0 0 471.677 126.604" enable-background="new 0 0 471.677 126.604"
 xml:space="preserve">
<rect x="0.01" y="1.27" fill="none" width="471.667" height="125.333"/>
<text transform="matrix(1 0 0 1 0.0098 8.3701)"><tspan x="0" y="0" font-family="'MyriadPro-Regular'" font-size="10">/Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy 2.pdf</tspan><tspan x="0" y="12" font-family="'MyriadPro-Regular'" font-size="10">/Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy.pdf</tspan><tspan x="0" y="24" font-family="'MyriadPro-Regular'" font-size="10">/Volumes/Secondary500/Temp/Untitled-2_Layer 1.pdf</tspan></text>
</svg>

xgawk で XML から必要なものを抜き出すのは非常に簡単で、通常の awk であるかのように記述できるのが特徴です。 また、表記方法もルーチンになっていますので、覚えておくと便利です。

#! /usr/local/bin/xgawk -f
# pick_from_svg.awk
# SVG ファイルからファイル名を取得する
# usage: xgawk -f pick_from_svg.awk sample.xml

@load xml

BEGIN {
    XMLMODE = 1;
    XMLCHARSET = "utf-8";
}

XMLCHARDATA {
    data = $0;
}

XMLENDELEM == "tspan" {
    print data;
}

たったこれだけのコードで XML から必要なもの (ここでは tspan タグに囲まれたファイル名) を抜き出すことができます。 実行してみます。

$ xgawk -f pick_from_svg.awk sample.xml
/Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy 2.pdf
/Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy.pdf
/Volumes/Secondary500/Temp/Untitled-2_Layer 1.pdf

Get a list of delimited filenames from a text file - Stack Overflow には Perl を用いた回答も記載されていますが、xgawk の方が簡単かつ明確に記述できています。 xgawk 自体がそんなにメジャーではないため、Linux 標準で使うようなことができないのが残念です。

tag_xgawk.png