自分で書いておきながらすぐ忘れてしまうので、覚え書きです……
DOM や Web 上のリソースの場合には DOM ツリーやディレクトリ構造といった「各ノード間の固定の親子関係」がありますが、 RDF の場合は、一つのディレクトリ内に全ての HTML リソースをぶち込んでリンクだけで相互に関連付けたような平坦なデータ構造になっています(ツリー状にして関連付けることもできますが、それはあくまで特殊な例です)。各ノード(この例なら個々の HTML リソース)は、データを持っておらず他のノードへのリンクのみを含んでいるタイプと、リンクを含まずデータのみを持っているタイプに分けられ、互いに網目状に結び付けられているという具合にイメージするといいでしょう。なお、個々の RDF データソースは、先の例で言うなら、全ての HTML リソースをぶち込んでいる親ディレクトリそのものにあたります。
この各ノードは「主語、述語、目的語」のような形で関連付けられています。例えばブックマークのセパレータなら、「 ID 名が rdf:#$xA55H1
のリソースの、プロパティ http://www.w3.org/1999/02/22-rdf-syntax-ns#type
が指すところは、 http://home.netscape.com/NC-rdf#Separator
である」といった具合です。逆に、そのリソースがセパレータであるかどうかが知りたければ、「 ID 名が rdf:#$xA55H1
のリソースのプロパティ http://www.w3.org/1999/02/22-rdf-syntax-ns#type
が指すところは何か?」と問えばいいわけです。
nsIRDFDataSource
には、これらの操作のためのメソッドが用意されています。どんなメソッドがあるかは IDL 定義を見るのが早いのですが、特によく使うものをいくつか紹介します。
まず、nsIRDFService
のメソッドから紹介します。
GetResource(aID)
getElementById(aID)
あるいはcreateElement(aID)
に相当する?GetLiteral(aString)
createTextNode(aString)
に相当する?これらのメソッドで得られるのは、ノードそのものではなく、そのノードへの参照情報です。XMLのDOMに慣れきっている場合は理解しにくいかもしれませんが、例えば、getElementById()
に渡す引数を数値から文字列に手動で変換する必要があるのだ、と考えて下さい。JavaScriptならString()
か***.toString()
を使う所を、RDFの操作ではGetResource()
やGetLiteral()
を使う、という具合です。
RDFの操作では、純粋にgetElementById()
などに相当するものはありません。現在のMozillaの実装は、XMLのDOMのようなオブジェクト指向的なアプローチではなく、C言語のような「昔ながらの手続き型処理」的なアプローチを取っています。サードパーティ製のラッパーを使わない場合、この点にはくれぐれも注意が必要です。
ノードや文字列リソースへの参照情報を得たら、後はそれを使って処理を行うだけです。具体的なデータの操作は個々のデータソースに対して行うもの(冒頭の例でいえば「ディレクトリの中のファイルを削除する」などのような感じ)なので、データソースのメソッドを使うことになります。
以下に、データソースの主要なメソッドを紹介します。なお、変数の引数は全て、前述の方法で得た参照情報です(返り値も参照情報です)。
GetSource(aProperty, aTarget, true)
,
GetSources(aProperty, aTarget, true)
getElementsByAttribute(aAttrName, aValue)
。GetTarget(aResource, aProperty, true)
,
GetTargets(aResource, aProperty, true)
getAttribute(aAttrName)
。ArcLabelsIn(aResource)
parentNode
。ArcLabelsOut(aResource)
attributes
と childNodes
。Assert(aResource, aProperty, aTarget, true)
appendChild(aNode)
, insertBefore(aNode, aReference)
。Unassert(aResource, aProperty, aTarget)
removeChild(aNode)
。