目次へ

7. Mixed Content、Anonymous Type

様々なXML Schemaの型の説明をしてきました。本章で最後です。本章では、内容に子供要素もテキストも含める型と、「名前のない」型について説明します。

7.1 Mixed Content

前々章、前章で、Simple Content、Complex Contentについて、説明してきました。以下の例を見てください。

 
<letterBody>
	<salutation>Dear Mr.<name>Robert Smith</name>.</salutation>
	Your Order of <quantity>1</quantity> <productName>Baby
	Monitor</productName> shipped from our warehouse on
	<shipDate>1999-05-21</shipDate>. ....
</letterBody>

上のXML文書のletterBody要素および、salutation要素は内容にテキストも子供要素も含みます。これらの要素は子供要素を含みますので、Complex Typeです。では、letterBody要素、salutation要素は、Simple Contentでしょうか、Complex Contentでしょうか。どちらにも当てはまりません。このように、内容にテキストも子供要素も含めるものをMixed Contentといいます。

Mixed Contentの型を定義するときは、mixed属性を使用します。

 
<complexType name="Complex Typeの名前" mixed="true">
要素の内容モデル
属性の定義
</complexType>

Mixed Contentは、子供要素をもつので、Complex Typeです。よって、Mixed Contentの型を定義するときは、complexType要素を使用します。mixed属性の値がtrueに設定されている場合、子供要素とともにテキストが存在してもよいことを示します。(mixed 属性のデフォルト値は、falseです。これは、mixed属性が存在しないComplex Typeはテキストの内容をもたない事を示します。)

以下に例を示します。

 
<complexType name="LetterBodyType" mixed="true">
   <sequence>
     <element name="salutation" type="SalutationType"/>
     <element name="quantity" type="xsd:positiveInteger" />
     <element name="productName" type="xsd:string" />
     <element name="shipdate" type="xsd:date" minOccurs="0"/>
   <sequence>
</complexType>

<complexType name="SalutationType" mixed="true">
   <sequence>
      <element name="name" type="xsd:string"/>
   </sequence>
</complexType>

上の例は、letterBody要素およびsalutation要素の型のスキーマを定義したものです。まず、letterBody要素の型として、LetterBodyTypeという名前のComplex Typeを定義しています。LetterBodyTypeは、mixed属性の値がtrueに設定されています。このため、LetterBodyType型の要素は、子供要素の他に、テキストも内容に持つことができます。

上の例では、もうひとつ、SalutationTypeという名前のComplex Typeを定義しています。これは、salutation要素の型になります。mixed属性の値がtrue設定されているため、SalutationType型の要素は、テキストも内容に含みます。

7.2 Mixed Contentの問題点

XML Schemaでは、要素の出現順番や出現回数、データ型などにいろいろな制限を加えることが出来ます。ところが、Mixed Contentに関しては、機能が充分ではありません。XML SchemaのMixed Contentの問題点には、以下のものがあげられます。

  • テキストと子供要素の出現の順番を規定することが出来ない
  • テキスト部分のデータ型を規定することが出来ない

以上の問題点について、説明します。

<article>
  <title>宅配装い発砲し逃走 東京・板橋</title>
 <subtitle>建築業の男性が重体</subtitle>
  <date>9日</date><time>午後8時55分</time>ごろ、<location>東京都板橋区赤塚
  6丁目</location>、建築業丸山寿治さん(70)方から、「主人が撃たれた」と110
  番通報があった。丸山さんは自宅玄関で、訪れた男に短銃で撃たれ重体。警視庁は殺人未
  遂事件とみて高島平署に捜査本部を置き、男の行方を追っている。
  ...
</article>

上のarticle要素は、内容に子供要素とテキストを含みますので、Mixed ContentのComplex Contentです。article要素の子供要素として、まずtitle要素とsubtitle要素が出現します。その後に、記事の内容が記述されます。記事の中には、いろいろなタグが埋め込まれています。記事の中から、事件に関する情報を取り出せるようになっています。article要素の型は以下のようになります。

<complexType name="ArticleType" mixed="true">
  <sequence>
    <element name="title" type="xsd:string"/>
    <element name="subtitle" type="xsd:string"/>
    <all>
      <element name="date" type="po:jpdate"/>
      <element name="time" type="po:jptime"/>
      <element name="location" type="xsd:string"/>
    </all>
 </sequence>
</complexType>

さて、article要素の場合、title要素の前やtitle要素とsubtitle要素の間にテキストが出現しないように規定したいです。しかし、そのような規定は出来ません。XML Schemaでmixed属性をtrueに設定した場合、テキストは、内容のどこに出現しても構いません。テキストの出現に関する規定をすることが出来ないのです。

また、テキスト部分の型の指定も出来ません。以下のXML文書を見てください。

<price>12300</price>
 <price>
   <USD>100</USD>
   <JPY>12300</JPY>
   <FRF>820</FRF>
 </price>

以上のようなprice要素を考えます。priceの通貨が円であったとしたら、priceの内容に、そのまま値段を書きます。いろいろな通貨に対する値段を記述する場合は、通貨の名前の子供要素を使用します。price要素の型は以下のようになるでしょう。

<complexType name="PriceType" mixed="true">
  <sequence minOccurs="0">
    <element name="USD" type="xsd:positiveInteger"/>
    <element name="JPY" type="xsd:positiveInteger"/>
    <element name="FRF" type="xsd:positiveInteger"/>
  </sequence>
</complexType>

以上のように、price要素は「内容にテキストも子供要素も出現する可能性がある」ので、その型はMixed Contentになります。ここで、price要素の直下に出現するテキスト部分を整数に規定したいです。しかし、Mixed Contentの場合、テキスト部分の型の定義をすることが出来ません。Price型の要素の直下に文字列が出現しても、XMLパーサはエラーにしません。price要素の内容のテキストに関する制限はアプリケーションで行う必要があります。

XML Schemaには、このような問題点があります。XML Schemaは文書系のデータを扱っているユーザーからは不評ですが、Mixed Contentに関する機能の不足がひとつの要因かもしれません。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp