倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

XPath 1.0 に定義されているデータ型

今回は XPath 1.0 に定義されている「データ型」を見ていきます(「XML Path Language (XPath) Version 1.0」を参照)(記事一覧)。 ここで扱う「データ型」とは、XPath 関数の引数や返り値の型として表れるデータの型のことです。

★データ型★


XPath 1.0 で出てくるデータ型には、次の4つがあります:

  • ノードセット (Node-sets)
  • ブール値 (Booleans)
  • 数値 (Numbers)
  • 文字列 (Strings)

以下で、それぞれのデータ型を少しだけ詳しく見ていきましょう。

★ノードセット : Node-sets★


「ノードセット」とは、ノードのセットのことです:-) 

XPath 1.0 では、「ノード」として以下のものが定義されています:

  • ルートノード (root nodes)
  • 要素ノード (element nodes)
  • テキストノード (text nodes)
  • 属性ノード (attribute nodes)
  • 名前空間ノード (namespace nodes)
  • 処理命令ノード (processing instruction nodes)
  • コメントノード (comment nodes)

ルートノード (Root Nodes)

「ルートノード」は XML ツリーの最も上の祖先ノードです(要素ではありません)。 ルートノードは QName を持ちません。 ルートノードは、子要素として文書要素(XML 文書の一番祖先の要素)、処理命令ノード、コメントノードを持つことができます。

要素ノード (Element Nodes)

「要素ノード」は XML 文書内の要素です。 要素ノードは QName を持ちます。 子ノードとして、要素ノード、テキストノード、処理命令ノード、コメントノードを持つことができます。

テキストノード (Text Nodes)

テキストノードは文字データの集まりです。 テキストノードは QName を持ちません。

  • 直前直後にテキストノードの兄弟要素を持ちません。
  • CDATA セクションは <, & をエスケープしてテキストノードの内容に埋め込まれます。

これらは DOM で「coalescing = true」と設定してあるのと同じかと。

属性ノード (Attribute Nodes)

「属性ノード」は要素内の属性です。 属性ノードは QName を持ちます。 デフォルトの属性(DTD の要素型宣言で #IMPLIED によって指定されるもの)も明示されている属性と同様に扱われます。

また、属性ノードの親ノードは要素ノードです(parent 軸で取得できる)が、属性ノードはその要素ノードの子ノードではありません(child 軸では取得できない)。

名前空間ノード (Namespace Nodes)

名前空間ノード」は要素内の名前空間宣言です。 名前空間ノードは QName を持ちます。 注意が必要なのは、明示的に宣言されている名前空間宣言だけでなく、暗黙的に (implicitly) 宣言されている名前空間宣言も含まれることでしょうか。 例えば、

<?xml version="1.0"?>
<p:root xmlns="default-ns"  xmlns:p="an-ns">
  <q:element xmlns:q="another-ns"/>
</p:root>

という XML 文書に対して、<q:element> 要素に関する名前空間ノードは

[xmlns="default-ns", xmlns:p="an-ns", xmlns:q="another-ns"]

となります。

また、名前空間ノードの親ノードは要素ノードです(parent 軸で取得できる)が、名前空間ノードはその要素ノードの子ノードではありません(child 軸では取得できない)。

処理命令ノード (Processing Instruction Nodes)

処理命令ノードは文書内の処理命令です。 ただし、文書型宣言内の処理命令は除きます。 処理命令ノードは QName を持ちません。

コメントノード (Comment Nodes)

コメントノードは文書内のコメントです。 ただし、文書型宣言内のコメントは除きます。 コメントノードは QName を持ちません。

★ブール値 : Booleans★


「ブール値」は「真 (true)」と「偽 (false)」の2値のみをもつデータです。

★数値 : Numbers★


「数値」は「倍精度の浮動小数点数」です。 Java でいうところの double 型に対応します。 以下に「数値」の性質を列挙しておきます:

  • 浮動小数点数である
  • 倍精度である
  • NaN (Not-a-Number, 1/0 の様なもの) を含む
  • +∞, -∞ を含む
  • +0, -0 を含む

★文字列 : Strings★


「文字列」は、XML 仕様書で定義され文字の0個以上の連なりです。 サロゲートペア (surrogate pair) を1つの文字として扱うことに注意しましょう(中国語とか扱うときに大事らしい)。