XML構文
OceanBaseデータベースの現行バージョンは、Extensible Markup Language(XML)1.0構文をサポートしていますが、XML SchemaやDTDはサポートしていません。 XMLドキュメントは主にステートメント宣言とドキュメント内容の2つの部分で構成されており、ドキュメント内容部分には通常、要素、属性、コメント、エスケープ文字、処理命令などが含まれます。
XMLステートメント宣言には固定された構造があります。例えば<?xml version="1.0"?>です。XMLドキュメント内容には、ルート要素が1つだけ存在し、そのルート要素には任意の数の子要素を含めることができます。また、要素には属性を含めることができます。例えば<book isbn="123-456-789">...<title>mybook</title><author>Alex</author></book>には、isbn="123-456-789"という属性が含まれており、同時に<title>と<author>という2つの子要素が含まれています。子要素は正しくネストする必要があります。空要素の場合、例えば<tag></tag>のように、省略形で<tag/>と表記できます。
XMLドキュメント内容では<>や引用符などの識別子が使用されているため、内容に特殊な記号が含まれる場合は、&???;を使用してエスケープする必要があります。例えば、Java<tm>という名前の子要素は、<name>Java<tm></name>としてエスケープされます。XML 1.0に組み込まれているエスケープ記号は以下の表のとおりです。
| エスケープ文字 | 表記記号 |
|---|---|
| < | < |
| > | > |
| & | & |
| " | " |
| ' | ' |
XMLドキュメントでは、ネームスペースnamespaceを定義して命名衝突を回避できます。namespaceを定義する構文は以下のとおりです:
xmlns:namespace-prefix="namespaceURI"
以下の例では、2種類のテーブル定義が存在するため、namespaceを使用して区別する必要があります。"http://www.example1.org/TR/html4/"と"http://www.example2.com.cn/furniture"は、ネームスペースを示すアドレスとして使用され、ネームスペースに一意の名前を付与する役割を果たします。
<doc>
<h:table xmlns:h="http://www.example1.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table xmlns:f="http://www.example2.com.cn/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</doc>
注意が必要な点として、ネームスペースが要素の開始タグ内で定義されている場合、同じプレフィックスを持つすべての子要素は同一のネームスペースに関連付けられます。
XPath
XPath(XML Path Language)は、XMLドキュメント内の特定の要素を位置特定するために使用される言語であり、EXTRACT、UPDATEXML などの式で使用できます。
XMLドキュメント自体は、要素ノード、属性ノード、テキストノードなどを含むノードツリーと見なすことができます。XPathは、データ構造ツリー内でノードを検索する機能を提供し、クエリ結果はノードセット(重複しないノードの無順序集合)、ブール値(TrueまたはFalse)、数値、または文字列になり得ます。
XPathの完全な構文は以下のとおりです。各Location Nodeは / で区切られ、最初のNodeでは / を省略できます。
/axis::nodetest()
以下の具体的な例を通じて、XPath構文について詳しく説明します。
/descendant::a,/child::text()
上記の例では:
descendant-or-self::para:現在のノードとそのすべての子孫のpara要素を選択します。self::para:現在のノードのpara要素を選択します。存在しない場合はNULLを返します。child::*/child::para:まず現在のノードのすべての子要素を選択し、その子ノードのpara要素を引き続き検索します。/:ルートノードを選択します。
ロケーター(Location Steps)
XPathはロケーターを使用してXMLドキュメント内のノードを選択します。
OceanBaseデータベースがサポートするロケーター情報は以下の表に示されています。
| 式 | 説明 |
|---|---|
| nodename | このノード名の下にあるすべてのサブノードを選択します。 |
| / | ルートノードから選択します。 |
| // | 適合する現在のノードからドキュメント内のノードを選択し、その位置は考慮されません。 |
| . | 現在のノードを選択します。 |
| .. | 現在のノードの親ノードを選択します。 |
| @ | プロパティを選択します。 |
アクシス(Axes)
アクシスは現在のノードを原点とし、XPathのクエリ方向を示します。
OceanBaseデータベースがサポートするアクシスは以下の表に示されています(そのうちchildがデフォルトのアクシスです)。
| 軸名 | 説明 |
|---|---|
| ancestor | 現在のノードのすべての祖先(親、祖父など)を選択します。 |
| ancestor-or-self | 現在のノードのすべての祖先(親、祖父など)と現在のノード自身を選択します。 |
| attribute | 現在のノードのすべての属性を選択します。 |
| child | 現在のノードのすべての子要素を選択します。 |
| descendant | 現在のノードのすべての子孫要素(子、孫など)を選択します。 |
| descendant-or-self | 現在のノードのすべての子孫要素(子、孫など)と現在のノード自身を選択します。 |
| namespace | 現在のノードのすべてのネームスペースノードを選択します。 |
| parent | 現在のノードの親ノードを選択します。 |
| self | 現在のノードを選択します。 |
説明
OceanBaseデータベースの現行バージョンでは、following-sibling、following、preceding、およびpreceding-siblingはサポートされていません。
以下の表はアクシス関連の例です。
| 例 | 説明 |
|---|---|
| child::book | 現在のノードに属するすべての子要素の book ノードを選択します。 |
| attribute::lang | 現在のノードの lang プロパティを選択します。 |
| child::* | 現在のノードのすべての子要素を選択します。 |
| attribute::* | 現在のノードのすべてのプロパティを選択します。 |
| child::text() | 現在のノードのすべてのテキスト子ノードを選択します。 |
| child::node() | 現在のノードのすべての子ノードを選択します。 |
| descendant::book | 現在のノードのすべての book 下位要素を選択します。 |
| ancestor::book | 現在のノードのすべての book 上位要素を選択します。 |
| ancestor-or-self::book | 現在のノードのすべての book 上位要素と、現在のノード自身(このノードが book ノードである場合)を選択します。 |
| child::*/child::price | 現在のノードのすべての price 孫ノードを選択します。 |
ノードテスト(Node Tests)
ノードセットはアクシス情報と組み合わせてXPathのクエリ内容を指定し、デフォルトはelementです。
OceanBaseデータベースがサポートするノードセットは以下の表に示されています。
| ノードセット名 | 説明 |
|---|---|
| para_name | 指定されたプロパティ名を持つノードを検索します。前の軸がattribute軸の場合はattribute名、ns軸の場合はns名を指定し、その他の軸ではデフォルトでelement名を指定します。 |
| text() | textノード(名前を指定できません)を検索します。 |
| node() | すべてのタイプのノード(名前を指定できません)を検索します。 |
| comment() | commentノード(名前を指定できません)を検索します。 |
| processing-instruction(literal) | piノードを検索します。literalが空の場合は任意のpiノードに対して真となり、そうでない場合はその値のpiノードのみがマッチします。 |
述語(Predicates)
述語は、特定のノードまたは指定された値を含むノードを検索するために使用されます。
OceanBaseデータベースがサポートする述語の例は以下の表に示されています。
| パス表現 | 結果 |
|---|---|
| //title[@lang='eng'] | title 要素をすべて選択し、これらの要素が eng 値を持つ lang プロパティを有すること。 |
| /bookstore/book[price>35.00] | bookstore 要素のすべての book 要素を選択し、その中の price 要素の値が35.00より大きいこと。 |
| /bookstore/book[price>35.00]/title | bookstore 要素内の book 要素のすべての title 要素を選択し、その中の price 要素の値が35.00より大きいこと。 |
ワイルドカード
XPathのワイルドカードは、任意のXML要素を選択するために使用できます。
OceanBaseデータベースがサポートするワイルドカードは以下の表に示されています。
| ワイルドカード名 | 説明 |
|---|---|
| * | 任意の要素ノードにマッチします。 |
| @* | 任意の属性ノードにマッチします。 |
| node() | 任意のタイプのノードにマッチします。 |
| text() | 任意のtextタイプのノードにマッチします。 |
以下の表は、ワイルドカードに関する例です。
| パス表現 | 説明 |
|---|---|
| /bookstore/* | bookstore 要素のすべての子要素を選択します。 |
| //* | ドキュメント内のすべての要素を選択します。 |
| //title[@* = "attribute"] | 属性を持つすべての title 要素を選択します。 |
演算子
OceanBaseデータベースのXPath式でサポートされる演算子は以下の表に示されています。
| 演算子名 | 説明 | インスタンス | 戻り値 |
|---|---|---|---|
| = | 等しい | price=9.80 | priceが9.80の場合はtrueを返し、そうでない場合はfalseを返します。 |
| != | 等しくない | price!=9.80 | priceが9.80ではない場合はtrueを返し、そうでない場合はfalseを返します。 |
| < | より小さい | price<9.80 | priceが9.80より小さい場合はtrueを返し、そうでない場合はfalseを返します。 |
| <= | より小さいか等しい | price<=9.80 | priceが9.80以下の場合はtrueを返し、そうでない場合はfalseを返します。 |
| > | より大きい | price>9.80 | priceが9.80より大きい場合はtrueを返し、そうでない場合はfalseを返します。 |
| >= | より大きいか等しい | price>=9.80 | priceが9.80以上の場合はtrueを返し、そうでない場合はfalseを返します。 |
| or | または | price=9.80 or price=9.70 | priceが9.80または9.70の場合はtrueを返し、そうでない場合はfalseを返します。 |
| and | と | price>9.00 and price<9.90 | priceが9.00より大きく、かつ9.90未満の場合はtrueを返し、そうでない場合はfalseを返します。 |
関数式
OceanBaseデータベースの現行バージョンのXPath定義でサポートされる関数式は以下の表に示されています。
| カテゴリ | 名前 | 説明 |
|---|---|---|
| ブール関数 | boolean true() | TRUE を返します。 |
| boolean false() | FALSE を返します。 |