SenseTalkスクリプトでXMLとツリー構造を使用する
SenseTalkのツリー構造は、XML形式のデータを簡単に読み取り、ツリー内のデータにアクセスして操作し、そのデータからXMLを生成する能力を提供します。ツリーは、リストとプロパティリスト(いくつかの制限あり)の両方として動作する階層的なデータ構造です。リストとして、ツリーはアイテムを含み、これらのアイテムはノードとも呼ばれ、それ自体がツリーです。プロパティリストとして、ツリーはXML用語でのノードの属性に対応するプロパティを持ちます。
ツリーとノード
ツリーは、任意の数の 子 ノードを持つことができる ルートノード からなる階層です。各子ノード自体が任意の数の子ノードを持つことができるツリーであり、そのように任意の深さまで続くことができます。各ノード(ルートノードを除く)は 親 ノードを持ち、これはそのノードを子として含むツリー(またはサブツリー)です。
親ノードとゼロ以上の子ノードを持つことに加えて、各ノードはタグ名を含む数個のプロパティまたは属性を持つことができます。
ツリーの基本構造は次のようになります:
ツリーの各ノードは自身の子ノードを持つことができるので、各ノード(その子とその後の子孫とともに)自体がツリーとなります。
ツリーとXML
ツリーは各種の階層データを保存するのに便利ですが、SenseTalkのツリー構造は特にXMLドキュメントやXMLベースのデータを扱うために設計されています。eXtensible Markup Language(XML)は、現在使用されている多種多様なデータ形式の基盤となる豊富で柔軟で複雑な言語です。
SenseTalkのツリー構造はXMLドキュメントやデータ構造の操作を簡単にし、個々の値に簡単にアクセスできるようにすると ともに、必要に応じてドキュメントのすべての部分にフルアクセスを提供します。
XMLの構造とその一部の用語を少なくとも基本的に理解すると、ツリーとそのXMLとの関係を完全に理解するのに役立ちます。以下の例のXMLドキュメントを考えてみてください:
<?xml version="1.0?>
<order id ="001">
<customer name="Janet Brown"/>
<product code="prod345" size="6">
<quantity>3</quantity>
<amount>23.45</amount>
</product>
</order>
上記の例では、最初の行はこれがバージョン1.0のXMLドキュメントであることを特定します。二番目と最後の行は、残りのコンテンツを order
タグで囲みます。この全体のセクションは、customer
と product
の2つの他の要素を含む ドキュメント ノード(上記の例のように)または 要素 ノード(XMLバージョン情報が欠けている場合)を構成します。customer
要素には name
属性 がありますが、追加のコンテンツはありません。 product
要素には code
と size
の属性があり、さらに2つの要素、quantity
と amount
を含みます。 quantity
と amount
の両方の要素には、テキストノード として知られる囲まれたテキストが含まれています。
この情報をツリーで表現すると、次のようになります:
括弧内の情報は、ノードの種類と、そのノードに存在する場合の属性を示しています。ツリー形式では、orderノードが2つの子供(customerとproduct)を持ち、productノードもまた2つの子供(quantityとamount)を持っていることがわかります。quantityとamountノードはそれぞれ一つの子供:対応する値を持つテキストノードを持っています。
XMLデータは主に 要素で構成されていることに注意してください(ドキュメントノードは特別な種類の要素として扱うことができます)。各要素にはタグ(order
、customer
、product
などのタグ)、属性(id
、name
、code
などの属性)があり、子供がいるかもしれません。子供たちは要素であるかもしれませんし、単純なテキスト値(3
、23.45
)であるかもしれません。他のノードタイプもありますが、それらはあまり一般的ではなく、この例では示されていません。
ここに示したorderの例は、現在使用されている多くのXMLフォーマットの典型的なものです。要素、属性、テキストをネストした構造に組み合わせることで、XMLは様々なフォーマットと、それらの中のバリエーションを可能にします。
ツリー = リスト + プロパティリスト
SenseTalkがツリーと共に働くアプローチは、ツリーを両方のコンテナタイプのハイブリッドとして扱うことで、リストとプロパティリストを扱うための言語固有の機能を活用しています。ツリーの子供はリストのアイテムのようにアクセスでき、その属性はプロパティリストのプロパティ値のようにアクセスできます。
ツリーについてはいくつかの詳細が異なります(以下で説明しますが)、全体として、リストとプロパティリストの扱いに慣れているなら、ツリーを扱うために必要なことのほとんどをすでに知っています。詳細はListsとProperty Listsを参照してください。
ツリーにはこれらの特性があるため、XMLとは何も関係がない状況でも、リストとプロパティリストの両方として動作するハイブリッドコンテナタイプとして役立つかもしれません。
ツリーとの作業
XMLからツリーを作成する
スクリプト内の内部ツリー構造にXMLデータを含むURLの内容をロードするには、as a tree
演算子を使用します:
put url "http://some.site/data.xml" as a tree into myTree
この文は指定されたURLにアクセスし、その内容を読み取ります。as a tree
演算子はSenseTalkにそのデータをXMLドキュメントとして扱い、それをツリー構造に変換し、その後変数myTree
に格納するように指示します。
スクリプトに直接含まれるXMLから始めることが便利かもしれません。as tree
演算子はこれにも同じように動作します:
set XMLSource to {{
<order id="001">
<customer name="Janet Brown"/>
<product code="prod345" size="6">
<quantity>3</quantity>
<amount>23.45</amount>
</product>
</order>
}}
}}
// XMLSource内のXML情報をツリーフォーマットの変数orderに格納します
以下の他の例では、このorderツリーが参照されています。
ツリーからXMLを作成する
ツリーのデータからXML形式のテキストを生成することは、XMLテキストからツリーを作成することよりも簡単です。ツリー構造がテキストとして使用されると、ツリーの内容のXML表現が自動的に作成されます。ツリーからXMLファイルを作成するには、たとえば、この構文を使用します:
put myTree into file "/path/to/aFile.xml"
ツリーの内容へのアクセス
ツリーの子は、リストのアイテムと同じようにアクセスできます。以下の例では、上述の as tree
構造例からの情報を使用します:
put item 1 of order
上記のコマンドを実行すると、次の結果が得られます:
ツリーの属性は、プロパティリストのプロパティと同じようにアクセスできます:
put order.id
上記のコマンドを実行すると、次の結果が得られます:001
アイテムとプロパティを組み合わせると、より深くネストされたデータにアクセスできます:
put the code of item 2 of order
上記のコマンドを実行すると、次の結果が得られます:prod345
XPath式を使用したツリーノードへのアクセス
XPathは、XMLドキュメントのコンテンツにアクセスするための標準的なメカニズムです。興味のあるノードやノードのセットを記述し、所望の情報を抽出する方法を提供します。SenseTalkは、この強力なメカニズムをnode
表現を通じてサポートします。これにより、タグ名によってツリー内のコンテンツにアクセスできます:
put node "*/customer" of order
上記のコマンドを実行すると、次の結果が得られます:
ノード表現は、ツリーのネストされたノードへのパスを記述できます:
put node "*/product/amount" of order
上記のコマン ドを実行すると、次の結果が得られます:
特別なtext
プロパティは、ツリーやノードのコンテンツだけを抽出するのに役立ちます:
put the text of node "*/product/amount" of order
上記のコマンドを実行すると、次の結果が得られます:23.45
all nodes
またはevery node
を使用して、XPath式に一致するツリーのすべてのノードのリストを返します:
put all nodes "*/product/*" of order
上記のコマンドを実行すると、次の結果が得られます: (
put everynode "*/*/amount" of order
上記のコマンドを実行すると、次の結果が得られます:
nodePath