XML
XML関連のあれこれ
XML Schema
業務で XML Schema を使う話が出てきたのでちょっと使ってみた。
XML Schema の例 :
<?xml version="1.0" encoding="Shift_JIS"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="schemaTest"> <xs:complexType> <xs:sequence> <!-- 必須 --> <xs:element name="required" type="xs:string" minOccurs="1" maxOccurs="1"/> <!-- 文字列 --> <xs:element name="fixedLength" minOccurs="0" maxOccurs="1"> <!-- 固定桁数 --> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="3" /> </xs:restriction> </xs:simpleType> </xs:element> <!-- 文字列 --> <xs:element name="rangeLength" minOccurs="0" maxOccurs="1"> <!-- 範囲桁数 --> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="2" /> <xs:maxLength value="5" /> </xs:restriction> </xs:simpleType> </xs:element> <!-- 数値 --> <xs:element name="number" minOccurs="0" maxOccurs="1"> <!-- 範囲 --> <xs:simpleType> <xs:restriction base="xs:int"> <xs:minExclusive value="1" /> <xs:maxExclusive value="3" /> </xs:restriction> </xs:simpleType> </xs:element> <!-- 正規表現 --> <xs:element name="regexp" minOccurs="0" maxOccurs="1"> <!-- 郵便番号 --> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="\d{3}-\d{4}" /> </xs:restriction> </xs:simpleType> </xs:element> <!-- リスト --> <xs:element name="list" type="xs:string" minOccurs="0" maxOccurs="3"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
主にXML Schemaによる値の検証についての確認を行ったためそれがメインの定義となっている。
- 構成
xs:element で要素を、xs:attribute で属性を定義できる。
タグの子要素は次の内容で定義できる。
タグの子要素は次の内容で定義できる。
<xs:element name="~"> <xs:complexType> <xs:sequence> <xs:element name="~" /> : </xs:sequence> </xs:complexType> </xs:element>
この xs:sequence の中に各要素を定義していく。
上記サンプルでは schemaTest タグ内に、required、fixedLength、rangeLength、number、regexp、list のタグを設定できることを表している。
上記サンプルでは schemaTest タグ内に、required、fixedLength、rangeLength、number、regexp、list のタグを設定できることを表している。
- タグの出現数
minOccurs、maxOccursにより定義する。
1回出現 | minOccurs="1" maxOccurs="1" |
0回か1回出現 | minOccurs="0" maxOccurs="1" |
1回~無限大出現 | minOccurs="1" maxOccurs="unbounded" |
0回~無限大出現 | minOccurs="0" maxOccurs="unbounded" |
xs:element、xs:sequenceに設定することが可能。
指定しなければ1回出現と同じ設定になる。
指定しなければ1回出現と同じ設定になる。
ちなみに属性の出現数は xs:attribute の use属性で定義できる。
1回出現 | use="required" |
0or1回出現 | use="optional" |
0回出現 | use="prohibited" |
- 型定義
xs:simpleType 要素でデータ型を定義することができる。
<xs:element name="fixedLength"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="3" /> </xs:restriction> </xs:simpleType> </xs:element>
上記定義はfixedLength要素は三桁固定の文字列であることを示している。
桁数範囲指定 : 2桁~5桁
<xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="2" /> <xs:maxLength value="5" /> </xs:restriction> </xs:simpleType>
数値範囲指定
<xs:simpleType> <xs:restriction base="xs:int"> <xs:minExclusive value="1" /> <xs:maxExclusive value="3" /> </xs:restriction> </xs:simpleType>
base="xs:int"で数値であることを定義している。
minExclusive、maxExclusiveはそれぞれ境界値として指定値は含まない指定方法。
境界値を含む定義は minInclusive、maxInclusive で定義できる。
minExclusive、maxExclusiveはそれぞれ境界値として指定値は含まない指定方法。
境界値を含む定義は minInclusive、maxInclusive で定義できる。
桁数を定義するには totalDigits、fractionDigits を使用することで可能となる。
後者は小数部の桁数の最大値。
後者は小数部の桁数の最大値。
正規表現
<xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="\d{3}-\d{4}" /> </xs:restriction> </xs:simpleType>
文字列の制約に正規表現による制約をかけることができる。
上記は郵便番号の形式を定義している。
上記は郵便番号の形式を定義している。
型名
上記 Schema では要素と型定義を一対一としたため全て匿名で定義した。
しかしこの定義方法だと同じ型を持つ要素を定義する際に同じ記述を繰り返す必要がある。
しかしこの定義方法だと同じ型を持つ要素を定義する際に同じ記述を繰り返す必要がある。
そうならないように型には名前を付けることができる。
<xs:element name="hoge" type="OriginalType" /> <xs:simpleType name="OriginalType"> <xs:restriction base="xs:int"> <xs:minInclusive value="0" /> <xs:maxInclusive value="100" /> </xs:restriction> </xs:simpleType>
上記 XML Schema にそったXML
<?xml version="1.0" encoding="Shift_JIS"?> <schemaTest xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="sample.xsd"> <required>213</required> <fixedLength>acb</fixedLength> <rangeLength>4afd</rangeLength> <number>2</number> <regexp>312-0134</regexp> <list>12</list> <list>25</list> <list>25</list> </schemaTest>
Schemaを使用する宣言は
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="sample.xsd"
この二つの属性でされている。
namespaceを使う場合は xsi:schemaLocation 属性を使用する。
namespaceを使う場合は xsi:schemaLocation 属性を使用する。
上記XMLを以下のように変更し、Javaプログラムで検証すると。
<number>1</number>
以下のような情報を得ることができる。
Error : line[10] , column[20] cvc-minExclusive-valid: Value '1' is not facet-valid with respect to minExclusive '1'. Error : line[10] , column[20] cvc-type.3.1.3: The value '1' of element 'number' is not valid.
コメント
- rTaUqbGYIlTMtcUewZ -- njrhst (2009-03-18 02:33:37)