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 を返します。 |