XML構文
OceanBaseデータベースの現在のバージョンは、Extensible Markup Language(XML)1.0構文をサポートしていますが、XMLSchemaや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" が含まれ、さらに2つの子要素 <title> と <author> を含みます。子要素は正しくネストする必要があります。空要素の場合、例えば <tag></tag> のように、省略形である <tag/> を使用できます。
XMLドキュメント内容では <> や引用符などの識別子が使用されているため、内容に特殊な記号が含まれる場合は、&???; を使用してエスケープする必要があります。例えば、Java<tm> は name という名前の子要素として、<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関数 | boolean true() | TRUEを返します。 |
| boolean false() | FALSEを返します。 |