とりあえずXMLデータバインディングに必要な知識をまとめてみました。

XML Schemaとは

  1. XML文章の要素が何を意味するのかを定義するためのもの
    • XMLの定義をXMLで行う
  2. DTDが力不足になったので登場
    • 名前空間(データ構造)を巧く表せない
    • 型がすくない
    • 継承の仕組みがない
  3. プログラムと相性がよい
    • SOAP
    • UDDI
    • JAXB

XML Schemaの定義

とりあえずXMLSpyで、XMLから生成してみます。

生成元XML: example.xml
01 <?xml version="1.0" encoding="UTF-8"?>
02 <employee>
03   <name></name>
04   <id></id>
05   <telephone>
06     <cell></cell>
07     <office></office>
08   </telephone>
09 </employee>
 
生成されたXSD: example.xsd
01 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
02 <!--W3C Schema generated by XMLSpy v2005 sp1 U (http://www.xmlspy.com)-->
03 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
04   <xs:element name="employee">
05     <xs:complexType>
06       <xs:sequence>
07         <xs:element name="name" type="xs:string"/>
08         <xs:element name="id" type="xs:string"/>
09         <xs:element name="telephone">
10           <xs:complexType>
11             <xs:sequence>
12               <xs:element name="cell" type="xs:string"/>
13               <xs:element name="office" type="xs:string"/>
14             </xs:sequence>
15           </xs:complexType>
16         </xs:element>
17       </xs:sequence>
18     </xs:complexType>
19   </xs:element>
20 </xs:schema>

立派立派、プログラムに食べさせるには十分そうです。

 

生成オプションは

#ref(): File not found: "XMLSpyParam.png" at page "XML XMLSchema"

ミソは、Element which were used onceで、Make local definitionにすることです。
こうしないと入れ子になっているところは別のタグ定義になってしまう。(XMLのValidationと言う観点では問題ないけど、これからWSDLなりJavaBean?を生成すると、いらない細かいクラスがたくさんできることになる)

XML Schemaの内容

生成されたものくらい一通り理解しておきます

  1. 最初にxml文書のヘッダが来ます。これはどのXMLでも同じ
    01 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. 次にスキーマ定義です
    03 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
         …
    20 </xs:schema>
    1. XML SchemaのSchemaの正式名は ''http://www.w3.org/2001/XMLSchema'' です
    2. Schemaの名前として ''http://www.w3.org/2001/XMLSchema'' を使っているだけでURLを見に行っているわけではありません。
    3. この要素(xs:schema)の中では、xs*1を ''http://www.w3.org/2001/XMLSchema'' として扱うことを宣言しています
    4. elementFormDefault?="qualified"と設定するとLocal要素にも名前空間が割り振られて、このXML Schemaの名前空間を使ったXMLから使うことができます。今回Local要素は作らないんで関係ありません。
  3. 以下employeeの定義です
    04   <xs:element name="employee">
    …
    19   </xs:element>
  4. employeeは複合型定義を含みます
    複合型定義とは、非終端記号のことです。配下に、複合型定義と単純型定義を持ちます。
    05     <xs:complexType>
    …
    18     </xs:complexType>
  5. 以下の内容は順番が指定されています
    06       <xs:sequence>
    … 
    17       </xs:sequence>
  6. nameとidは単純型定義です。
    07         <xs:element name="name" type="xs:string"/>
    08         <xs:element name="id" type="xs:string"/>
    1. 単純型定義には型名を指定します。
    2. 型名は次章で整理します。
  7. telephoneは複合型定義です
    09         <xs:element name="telephone">
    10           <xs:complexType>
    11             <xs:sequence>
    12               <xs:element name="cell" type="xs:string"/>
    13               <xs:element name="office" type="xs:string"/>
    14             </xs:sequence>
    15           </xs:complexType>
    16         </xs:element>

単純型定義に指定できる型

xs:string文字列
xs:boolean真偽値(true/false/1/0)
xs:byte符号付き1バイト整数(-128〜127)
xs:short符号付き2バイト整数(-32768〜32767)
xs:int符号付き4バイト整数(-2147483648〜2147483647)
xs:long符号付き8バイト整数(-9223372036854775808〜9223372036854775807)
xs:unsignedByte符号無し1バイト整数(0〜255)
xs:unsignedShort符号無し2バイト整数(0〜65535)
xs:unsignedInt符号無し4バイト整数(0〜4294967295)
xs:unsignedlong符号無し8バイト整数(0〜18446744073709551615)
xs:integer整数
xs:positiveInteger正の整数(1以上)
xs:negativeInteger負の整数(0未満)
xs:nonPositiveInteger?非正の整数(1未満)
xs:nonNegativeInteger?非負の整数(0以上)
xs:float単制度32bit浮動小数
xs:double倍制度64bit浮動小数
xs:base64Binaryバイナリデータ(Base64でエンコード)
xs:hexBinaryバイナリデータ(16進表記 [0-9a-fA-F]*)
xs:duration期間( P1Y2M3DT4H5M6.7S = 1年2ヶ月3日4時間5分6.7秒間)
xs:dateTime日付時刻( CCYY-MM-DDThh:mm:ss.sss±hh:mm 2001-01-01T01:01:01.001+9:00)
xs:date日付( CCYY-MM-DD±hh:mm )
xs:time時刻( hh:mm:ss.sss±hh:mm)
xs:anyURIURI形式の文字列( ldap://foo.com:386/ )

他に、[年]・[月]・[年月]・[日]・[改行文字]などがあるが、使わないので省略。

XML文章から、XML Schemaを指定する

  1. 例のごとくXMLSpyからXMLを作成します。生成された閉じているタグに値を設定すれば完成。
    employee.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:noNamespaceSchemaLocation="./example.xsd">
    	<name/>
    	<id/>
    	<telephone>
    		<cell/>
    		<office/>
    	</telephone>
    </employee>
    1. "http://www.w3.org/2001/XMLSchema-instance"は、XML Schemaを適用する際に用いる特別なSchemaです
    2. デフォルトの名前空間*2にXML Schemaを適用するときには、noNamespaceSchemaLocation?属性にXML Schemaファイルを設定します
  2. 名前空間を使いたい場合には以下のようにします。
    employee2.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:employee="http://www.foo.com/employee"
              xsi:SchemaLocation="http://www.foo.com/employee ./example.xsd">
    	<employee:name/>
    	<employee:id/>
    	<employee:telephone>
    		<employee:cell/>
    		<employee:office/>
    	</employee:telephone>
    </employee>
    1. 例によって "http://www.foo.com/employee" に xsdファイル があるわけではありません。名前空間の一意名としてURIを書くのが一般的なので、employeeの本体を "http://www.foo.com/employee" と定義してあります。
    2. xsdファイル と "http://www.foo.com/employee" とをバインディングするのが xsi:SchemaLocation?="http://www.foo.com/employee ./example.xsd

要素の存在条件指定

<xs:sequence>の他にも以下の存在条件指定ができます。

  1. 要素の参照と出現回数の指定
    <xs:element ref="要素名" minOccurs="最低出現回数" maxOccurs="最大出現回数"/>
    
    minOccurs に、"0"を指定すると無くても良い要素になる
    maxOccurs に、"unbounded"を指定すると無制限になる
  2. 順番に出現
    <xs:sequence minOccurs="最低出現回数" maxOccurs="最大出現回数">
    </xs:sequence>
  3. いずれか一つを選択
    <xs:choice minOccurs="最低出現回数" maxOccurs="最大出現回数">
      <xs:element name="str1" type="xs:string"/>
      <xs:element name="str2" type="xs:string"/>
    </xs:choice>
  4. 順不同な出現
    <xs:all minOccurs="最低出現回数" maxOccurs="最大出現回数">
      <xs:element name="str1" type="xs:string"/>
      <xs:element name="str2" type="xs:string"/>
    </xs:all>
  5. 任意の要素が出現
    <xs:any namespace="****" processContents="****"
      minOccurs="最低出現回数" maxOccurs="最大出現回数"/>
    
    ここに出現した要素に対して:
    namespace       ##any   全ての名前空間から要素定義を検索(デフォルト)
                    ##other このSchema以外から要素定義を検索
                    ##targetNamespace このSchemaから要素定義を検索
                    ##local local要素をこの場で新たに作成
    
    processContents strict 名前空間から要素定義を検索して検証する(デフォルト)
                    lax    名前空間から要素定義を検索して見つかれば検証する
                    skip   検証しない
  6. 単純なグループ化(外部定義や出現方法をまとめて定義する時に使う)
    グループ定義:
    <xs:group name="グループ名">
    </xs:group>
     
    グループ参照:
    <xs:group ref="グループ名" minOccurs="最低出現回数" maxOccurs="最大出現回数"/>

属性指定

  1. 下のようにタグに属性を指定できるようにする場合にはどうするか?
    <?xml version="1.0" encoding="UTF-8"?>
    <body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="bodydef.xsd">
    	<name>Foo Bar</name>
    	<length unit="m">1.70</length>
    	<weight unit="kg" scale="1000">1.53</weight>
    </body>
  2. 型の拡張によって、属性をつける。
    <xs:element name="length" type="LengthType"/>
    
    <xs:complexType name="LengthType">
      <xs:simpleContent>
        <xs:extension base="xs:double">
          <xs:attribute name="unit" type="xs:string" use="required"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
    1. LengthType?は、double型にunit属性(xs:string型)をつけられるようにする。
    2. 新しく作られた型は、基本型と同様に elment の方として指定できる。
    3. 属性を指定する時には、必須かどうかを指定することができる
      use="required"必須
      use="optional"任意
      use="prohibit"使用不可
  3. 指定できる値を指定したい。
    <xs:element name="length" type="LengthType"/>
    
    <xs:complexType name="LengthType">
      <xs:simpleContent>
        <xs:extension base="xs:double">
          <xs:attribute name="unit" type="LengthType" use="required"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
    
    <xs:simpleType name="LengthUnitType">
      <xs:restriction base="xs:string">
        <xs:enumeration value="m"/>
        <xs:enumeration value="ft"/>
      </xs:restriction>
    </xs:simpleType>
    1. LengthType?型のunit属性には、"m"か"ft"のみしか指定できないようにする。
    2. このXMLSchemaを実装したXMLで、LengthType?のunit属性に、これ以外の値が入っていた時には、Validationエラーになる
  4. 属性を複数指定する時には?
    <xs:complexType name="WeightType">
      <xs:simpleContent>
        <xs:extension base="xs:double">
          <xs:attribute name="unit" type="WeightUnitType" use="required"/>
          <xs:attribute name="scale" type="xs:positiveInteger" use="optional" />
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
    
    <xs:simpleType name="WeightUnitType">
     <xs:restriction base="xs:string">
       <xs:enumeration value="kg"/>
       <xs:enumeration value="lbs"/>
     </xs:restriction>
    </xs:simpleType>
    1. 型を拡張する時に attribute を複数回繰り返せばよい
    2. ここではscaleは任意の属性とした
  5. 属性定義を外出しで定義して使い回したい
    xs:includeで外部のxsdファイルを参照できる
    bodydef.xsd
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               elementFormDefault="qualified"
               attributeFormDefault="unqualified">
    
    <xs:include schemaLocation="unit_typedef.xsd"/>
    
    <xs:element name="body">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="name" type="xs:string"/>
          <xs:element name="length" type="LengthType"/>
          <xs:element name="weight" type="WeightType"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    </xs:schema>
     
    unit_typedef.xsd
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               elementFormDefault="qualified"
               attributeFormDefault="unqualified">
    
    <xs:complexType name="LengthType">
      <xs:simpleContent>
        <xs:extension base="xs:double">
          <xs:attribute name="unit" type="LengthUnitType" use="required"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
    <xs:simpleType name="LengthUnitType">
      <xs:restriction base="xs:string">
        <xs:enumeration value="m"/>
        <xs:enumeration value="ft"/>
      </xs:restriction>
    </xs:simpleType>
    
    <xs:complexType name="WeightType">
    <xs:simpleContent>
      <xs:extension base="xs:double">
        <xs:attribute name="unit" type="WeightUnitType" use="required"/>
          <xs:attribute name="scale" type="xs:positiveInteger" use="optional" />
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>
    <xs:simpleType name="WeightUnitType">
      <xs:restriction base="xs:string">
        <xs:enumeration value="kg"/>
        <xs:enumeration value="lbs"/>
      </xs:restriction>
    </xs:simpleType>
    
    </xs:schema>

参考文献

  1. @IT, XMLカレッジ,http://www.atmarkit.co.jp/fxml/indexes/index_col.html
  2. @IT, XMLテクニック集,http://www.atmarkit.co.jp/fxml/tecs/index/tech01.html
  3. たのしいXML, http://www.cityfujisawa.ne.jp/~yanai/xml/home.html
  4. 富士通ラーニングメディア, 2002, XML基礎(講習資料)

Java


*1 名前接頭辞
*2 匿名の名前空間ともいうらしいです

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2006-02-18 (土) 13:38:00 (6866d)
Short-URL:
ISBN10
ISBN13
9784061426061