System Events の XML サポート

リクエストがあったので、何日か前に書いた 10.4 での新機能 XML のサポートを再掲します。Thanks!河野さん。

XML のサポートは、System Events でされています。といっても、XML のパーサやなんやかやといった便利な機能はありません。パースするにしても自分で行う必要があります。機能を調べるにあたって asahi.com:朝日新聞の速報ニュースサイトRDF を使いました。この RDF をデスクトップにおいておき以下のスクリプトを試しました。

Script Editor で開く

set theFile to (path to desktop folder from user domain as text) & "index.rdf"

tell application "System Events"
    set theData to contents of (XML file theFile)
end tell

まず、これで RDF ファイル内の XML データを取得します。よくわからないのですが、XML file クラスは、ファイルなんですが...ただ、パスでファイルを指定するだけではだめなようです。contents 属性は、XML file クラスのもので XML file の XML data クラスを表します。XML data クラスを見ると text 属性があります。これが、XML ファイル内の文字列になります。ファイルを開いたときに見ることができるデータです。

XML data クラスは、XML elements を要素として持っています。ですので、ここから個々の XML 要素をたどることができます。XML 要素というのは、タグで囲まれたデータのことです。XML は、ツリー構造になっているのでパースするには再帰を使うのが一番簡単です。

Script Editor で開く

set theFile to (path to desktop folder from user domain as text) & "index.rdf"
set theList to {}

tell application "System Events"
    set theData to contents of XML file theFile
    my parseXML(theData, theList)
end tell

theList

on parseXML(xmlData, parseResult)
    tell application "System Events"
        if not (exists XML elements of xmlData) then return

        repeat with thisItem in (XML elements of xmlData)
            set end of parseResult to {name of thisItem, value of thisItem}
            my parseXML(thisItem, parseResult)
        end repeat
    end tell
end parseXML

結構時間がかかりますね...。iTunes の XML データを調べるのにはお勧めできませんね。すべての XML 要素をただ取り出しているだけです。これだけでは何の役にも立ちません。目的の要素を秩序だって取り出すには、RDF や RSS がどのように構成されているかを知る必要があります。この辺りは、The Web Kanzaki が参考になるでしょう。asahi.com の RDF から記事の要素を取り出すだけなら、上記のスクリプトを次のようにすればいいでしょう。

Script Editor で開く

on parseXML(xmlData, parseResult)
    tell application "System Events"
        if not (exists XML elements of xmlData) then return

        repeat with thisItem in (XML elements of xmlData)
            if name of thisItem is "item" then
                set end of parseResult to thisItem
            end if
            my parseXML(thisItem, parseResult)
        end repeat
    end tell
end parseXML

取得できた記事部分の加工としては、XML elements を取り出して値を調べればいいでしょう。しかし、時間がかかる...。アルゴリズムがおかしいのかな?とてもではないですが、RSS リーダーじみたことができないですね。

0 件のコメント :

コメントを投稿