本ブログの更新は停止しています。更新は新しいサイトの Travellers Tales で行なっています。

AppleScript で XML を parse する


AppleScript で XML を取り扱いたい場合、XML TOOL という OSAX がちゃんと存在するようなのですが、そこまで本格的じゃなくていい、という場合のために、簡単なコードを書きました。

元々、自作のツール PingTrackback のために書いたものです (Ver. 1.0 には未実装)。Yuta さんの AppleScript Tips を参考にしています。

tmpData には、解析したいデータを渡します。keyStr には、取り出したいキーを書きます。あるサーバから返ってきた XML の中の <error> </error> というキーで囲まれた値を取り出すには、

simpleTagParse(serverResponse, "error")

という具合に使います。

error というキーがなかった場合は、 missing value を返します。また、同じキーが2つ以上ある場合は、最初の1つ目しか返しません。XML 中で、親のキーが違うけれど、子のキーが同じ名前で重なっている場合、まず、親のキーで値を取り出してやって、その結果からさらに目的のキーで値を抽出すればよいです。例えば以下のようなものを想定してます。

<response>
<string>ABC</string>
</response>
<message>
<string>XYZ</string>
</message>

<message> </message> に挟まれた string の値を取り出したい場合、以下のようになります。

set temChildData to simpleTagParse(tmpData, "message")
set stringOfMessage to simpleTagParse(tmpChildData, "string")

simpleTagParse(tmpData, keyStr) の具体的なコードは以下の通りです。


on simpleTagParse(tmpData, keyStr)
set beginKey to "<" & keyStr & ">" as Unicode text
set endKey to "</" & keyStr & ">" as Unicode text
set oldDelim to AppleScript's text item delimiters
try
set AppleScript's text item delimiters to beginKey
set tmpData2 to second text item of tmpData
set AppleScript's text item delimiters to endKey
set tmpData3 to (first text item of tmpData2) as Unicode text
set AppleScript's text item delimiters to oldDelim
return tmpData3
on error
if tmpData does not contain keyStr then
log "The key doesn't exist in the data"
end if
set AppleScript's text item delimiters to oldDelim
return missing value
end try
end simpleTagParse

Posted: 火 - 6月 15, 2004 at 02:44 AM               Hatena Bookmark



©