2022/07/01

XMLの基本

XML文書の構造

XML文書は、XML宣言文書型宣言XMLインスタンスの3つのパートから構成される。
XML宣言は「この文書がXMLで書かれている」ことを宣言するための記述で、XML文書の先頭に記述する。
文書型宣言(DOCTYPE宣言)はDTD(Document Type Definition: 文書型定義)を使って、XML文書独自の要素や属性の記述ルールを指定することができる。例えば、次の例は「rootという要素はchildという要素を1つ持つこと」、「childという要素はテキストデータを記述すること」とXML文書が守るべきルールを定義している。
XMLインスタンスの部分は実際にXML文書を記述する箇所。XML文書には最低限XMLインスタンスを記述しなければならない。(XML宣言や文書型宣言は省略することができる。)

XML文書の構造

XML文書には整形式XML文書(well-formed XML document)と妥当なXML文書(valid XML Document)の2種類がある。整形式XML文書はXMLで規定している規則を守って記述されたXML文書で、すべてのXML文書は整形式XML文書でなければならない。妥当なXML文書はDTDを使って利用者が指定した要素や属性などの記述るルールを守っているXML文書を指す。妥当なXML文書はすべて整形式XML文書でなければならない

整形式XML文書と妥当なXML文書

XML宣言の記述

XML宣言はこの文書がXML文書であることを示す記述でXML文書の先頭に記述する。XML宣言は「<?xml」と「?>」で囲んで記述する。「<?xml」のxmlの文字列は必ず小文字で記述しなければならない。また、「<?xml」と「?>」の各文字の間に空白や改行、タブなどの無視できる空白を入れてはいけない

XML宣言

  • version属性(必須)
 version属性にはXML規格を表すバージョン番号を「1.0」や「2.0」の形式で記述する

  • encoding属性(省略可) 
encoding属性にはこのXML文書がどの文字符号化方式(文字エンコーディング)を使って作成されているかを記述する(省略時には「UTF-8」または「UTF-16」を使って作成されているものとみなされる)。XMLパーサはこのencoding属性に指定された文字列符号化方式を使ってエンコーディングを行う

  • standalone属性(省略可) 
standalone属性はXMLパーサが外部実体などで使用する外部ファイルの読み込みを行うか否かを指定する。XMLパーサに外部ファイルを参照させる時には「no」を、外部ファイルを参照させない時には「yes」を指定する。省略時は「no」が設定されたものとみなす

文書型宣言の記述

文書型宣言(DOCTYPE宣言)はこのXML文書の要素の現れる場所や出現回数、属性の形式などを宣言する。実際のXMLインスタンスの記述ルールはDTDなどの定義言語を使って記述する。
DOCTYPE宣言は「<!DOCTYPE」の記述に続けて文書要素名を記述する。実際のルールを定義するDTDは文書要素名の後ろに[]で括って直接DTDを記述する場合(内部サブセット)と、DTD箇所だけを外部ファイルに記述する場合(外部サブセット)の2通りの構成がある。

DOCTYPE宣言

内部サブセットと外部サブセット

XMLインスタンスの構造

XMLインスタンスはある1つの要素を規定としたツリー構造をとらなければならない
XMLインスタンスのツリー構造

DTDの記述

DTDでは要素型宣言および属性リスト宣言、実体や外部リソース形式を使ってXMLインスタンスの構造を定義する。これらは次の4つの宣言を使って記述する。どの順番で記述しても構わないが、キーワードは大文字で記述しなければならない
宣言名 キーワード 宣言内容
要素型宣言 ELEMENTキーワード 要素がどのような内容を持つかを定義する
属性リスト宣言 ATTLISTキーワード 要素が持つ属性を定義する
実体宣言 ENTITYキーワード 実体の内容と実体名を定義する
記法宣言 NOTATIONキーワード 外部ファイルのデータ形式を定義する

内部サブセットと外部サブセットを混在させて記述した場合には、内部サブセットと外部サブセットの内容がマージされる。属性リスト宣言と実体宣言が重複した場合は内部サブセット定義が有効となる

名前空間

要素名や属性名の重複(衝突)を回避するための規格がXML名前空間(Namespace in XML)。
名前空間に属した要素を記述するには次の書式を使用する

名前空間に属した要素の記述

xmlns:名前空間接頭辞="URI"」の箇所でURIと名前空間接頭辞の関連を定義している。
名前空間に属する要素を記述するには要素名の箇所を「名前空間接頭辞:要素名」の形式で記述する

名前空間に属する要素の記述

デフォルトの名前空間

次の書式のように名前空間の定義で名前空間接頭辞を記述しない場合、指定したURIはデフォルトの名前空間として扱われる。デフォルトの名前空間を定義すると、デフォルトの名前空間を定義した要素自体と名前空間接頭辞を記述していない下位の要素は、すべてデフォルトの名前空間に属する要素として扱われる。(デフォルトの名前空間は属性には適用されない)

デフォルトの名前空間の定義

デフォルトの名前空間

XPath

XPathはXML文書中の要素や属性などを特定するための記法。XPathではXML文書をツリー構造で表す。XPathのツリー構造はノードと呼ばれるパーツで構成される。XPathのツリー構造ではXML文書の文書要素の親ノードとして仮想的なノード(ルートノード)を持ち、「/」と記述する。

XPathのツリー構造

XPathのノードには次の7種類がある。属性ノードと名前空間ノードは要素ノードの子ノードではなく従属関係にあるノードとして扱われる。
ノード名 内容
ルートノード XML文書の文書要素(ルート要素)の仮想的な親ノード
要素ノード 要素を表すノード
テキストノード 要素の内容として記述されたテキストデータを表すノード
コメントノード コメントを表すノード
処理命令ノード 処理命令を表すノード
属性ノード 要素内で記述される属性を表すノード
名前空間ノード 名前空間を表すノード

ノードを特定するための記述をロケーションパス、ロケーションパスの記述の個々の条件をロケーションステップ、ロケーションパスを適用する起点となるノードをコンテキストノードと呼ぶ。

ロケーションパス~1

ロケーションパス~2

ロケーションステップの記述

ロケーションステップはある基点(コンテキストノード)から次のノードの方向を示すと、軸の示す方向のノードの集まりを指定するノードテストを使って「軸::ノードテスト」の形式で記述する。

軸ではコンテキストノードから次のノードを探す方向を次表のキーワードを使って示す。
キーワード 説明
self コンテキストノード自身
child コンテキストノードの子ノード
parent コンテキストノードの親ノード
ancestor コンテキストノードの祖先ノード
ancestor-or-self コンテキストノード自身とコンテキストノードの祖先ノード
descendant コンテキストノードの子孫ノード
descendant-or-self コンテキストノード自身とコンテキストノードの子孫ノード
preceding-sibling コンテキストノードより前に出現する兄弟ノード
preceding コンテキストノードより前に出現する全てのノード
following-sibling コンテキストノードより後に出現する兄弟ノード
following コンテキストノードより後に出現する全てのノード
attribute コンテキストノードの属性ノード
namespace コンテキストノードの名前空間

キーワードの対象となるノード

軸の示す範囲

ノードテストは軸で示される方向の中で対象とするノードの種類を指定する。
ノードテスト 説明
要素名 指定された要素名の要素ノード
属性名 指定された属性名の属性ノード
text() テキストノード
comment() コメントノード
processing-instruction() 全ての処理命令ノード
node() 全てのノード
* 軸がattirbuteの場合には全ての属性ノード
軸がnamespaceの場合には全ての名前空間ノード
軸が上記以外の場合には全ての要素ノード

軸とノードテストの記述には下表の省略形を使うことができる。
軸、ノードテストの記述 説明 省略形
child:: 子ノード 省略可能(軸を記述しない場合はchildキーワードが指定されたものとみなされる)
attribute:: 属性ノード @
self::node() 自分自身のノード .
parent::node() 親ノード ..
descendant-or-self:: コンテキストノード自身と
コンテキストノードの子孫ノード
//

childキーワードとattributeキーワードの省略形

省略形の記述例

「軸::ノードテスト」の記述に該当するノードが複数ある場合、そのノードの集まり(ノードセット)に対してさらた条件を付けてノードを絞り込むには述語を記述する。

述語

XPath関数

述語の式で利用できるXPath関数
XPath関数 説明
position() ノードセット内のノードの順番を取得する
last() ノードセットの最後のノードを取得する
count() ノードセットに含まれるノード数を取得する
local-name(ロケーションパス) ノードの名前を取得する
name(ロケーションパス) 名前空間接頭辞とノードの名前を取得する
namespace-uri(ロケーションパス) 名前空間URIを取得する
string-length(文字列) 文字数を取得する
substring(文字列,オフセット,文字数) 文字列を抽出する
concat(文字列1,文字列2,,,) 文字列を結合する
contains(文字列,文字列) 文字列が含まれるかを調べる
sum(ノードセット) ノードセットの合計値を求める

0 件のコメント:

コメントを投稿

人気の投稿