XML のパース

xml parser using perl/awk/python - Stack Overflow からですが、日本語訳をしておきます。

以下のようなデータ形式の XML があります。

<net NetName="abc" attr1="123" attr2="234" attr3="345".../>
<net NetName="cde" attr1="456" attr2="567" attr3="678".../>
....

awk の一行野郎で "abc" のところの attr3 を取得して "345" を返せますか?

ええ、awk で返せますとも! もちろん、一行野郎で!

仮に以下のような XML だとします。

$ cat test.xml
<?xml version="1.0" encoding="UTF-8"?>
<netlist>
<net NetName="abc" attr1="123" attr2="234" attr3="345">123</net>
<net NetName="cde" attr1="456" attr2="567" attr3="678">456</net>
</netlist>

これを xgawk の一行野郎で以下のように処理します。

$ xgawk -lxml 'XMLATTR["NetName"] == "abc"{print XMLATTR["attr3"]}' test.xml
345

というわけで簡単にできました。

もっともフォーマットが固定されているなどの前提があるのであれば、以下のようなスクリプトで普通の awk でも処理できるかもしれません。

$ nawk -F '[ ="]+' '/abc/{for(i=1;i<=NF;i++){if($i=="attr3"){print $(i+1)}}}' test.xml
345

XML を普通の awk で処理するのはさすがに怖いですね。

tag_xgawk.png