リクエストがあったので、何日か前に書いた 10.4 での新機能 XML のサポートを再掲します。Thanks!河野さん。
XML のサポートは、System Events でされています。といっても、XML のパーサやなんやかやといった便利な機能はありません。パースするにしても自分で行う必要があります。機能を調べるにあたって asahi.com:朝日新聞の速報ニュースサイト の RDF を使いました。この RDF をデスクトップにおいておき以下のスクリプトを試しました。
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 は、ツリー構造になっているのでパースするには再帰を使うのが一番簡単です。
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 から記事の要素を取り出すだけなら、上記のスクリプトを次のようにすればいいでしょう。
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 件のコメント :
コメントを投稿