倭マン's BLOG

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

要素の概要 (1) -- XML ノード

前回RELAX NG に定義されている要素を分類しましたが、それぞれのカテゴリに属する要素を簡単に見ていきます(参考「RELAX NG 入門」)。

今回は XML ノードを定義する要素。

  • <element>
  • <empty>
  • <attribute>
  • <text>

<element> 要素, <empty> 要素


<element> 要素は要素を定義する要素です。 @name 属性によって要素名を指定します。

例えば、次のような、ルート要素しか持たない XML 文書に対して

<root/>

これに適合する RELAX NG スキーマは以下のようになります:

<element name="root" xmlns="http://relaxng.org/ns/structure/1.0">
  <empty/>
</element>

幾つか注意を:

  • 名前空間宣言は、<element>, <empty> が名前空間 "http://relaxng/ns/structure/1.0" に属するようにしています。
  • 「<element name="root" ...」で <root> 要素を定義しています。
  • 定義対象の要素が属性も子ノードも持たない場合は、スキーマ定義に <empty> 要素を付加します。
  • 名前空間を指定する方法はそのうちに。

★子要素を定義する★

子要素を定義したい場合は、<element> 要素の子要素としてまた <element> 要素を付加します。 例えば、以下のような XML 文書に対して

<parent>
  <child1/>
  <child2/>
</parent>

スキーマ定義は次のようになります:

<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0">

  <element name="child1">
    <empty/>
  </element>

  <element name="child2">
    <empty/>
  </element>

</element>

★要素の順序★

要素の出現順序は、スキーマ定義に現れる順序と一致していなければなりません。 例えば、上記のスキーマ定義は次のXML 文書にはマッチしません

<parent>
  <child2/>
  <child1/>
</parent>

<attribute> 要素


<attribute> は属性を定義する要素です。 @name 属性によって属性名を指定します。

例えば、次のような属性を持つ要素を考えましょう:

<parent att="value"/>

これに適合する RELAX NG スキーマは以下のようになります:

<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0">
  <attribute name="att"><text/></attribute>
</element>

幾つか注意を:

  • <element> 要素は <parent> 要素を定義しています。
  • 「<attribute name="att" ...」で @att 属性を定義しています。
  • <attribute> 要素に <text> 要素を付加することで、@att 属性の値がテキストであることを定義しています。
  • <parent> 要素のスキーマ定義に対して、属性が定義されていれば子要素がなくても <empty> 要素を付加する必要はありません。
  • 名前空間を指定する方法はそのうちに。

★チョット簡略化★

<attribute> 要素の子要素となる <text> 要素は省略できます。 例えば、上記のスキーマ定義は次の様に簡略化できます:

<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0">
  <attribute name="att"/>
</element>

★属性の順序★

属性の出現順序は、要素の場合と違って、スキーマ定義に現れる順序と一致する必要はありません。 例えば、次のスキーマ定義は

<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0">
  <attribute name="att1"/>
  <attribute name="att2"/>
</element>

以下のどちらの XML 文書にもマッチします

<parent att1="value1" att2="value2"/>
<parent att2="value2" att1="value1"/>

★子要素と属性の順序★

子要素の定義の後に属性の定義が現れてもかまいません。 例えば、次のスキーマ定義は

<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0">
  <element name="child"><empty/></element>
  <attribute name="att"/>
</element>

以下の XML 文書にマッチします

<parent att="value">
  <child/>
</parent>

<text> 要素


<text> 要素は(すでに何度か出てきましたが)以下のような定義に使います:

  • 要素の子要素 → 子テキスト
  • 属性の子要素 → 属性の値

子テキストの場合だけサンプルを見てみましょう。 以下のようなスキーマ定義は

<element name="em" xmlns="http://relaxng.org/ns/structure/1.0">
  <text/>
</element>

以下の XML 文書にマッチします:

<em>テキスト</em>