メインメニュー






更新履歴
取得中です。



※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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 のタグを設定できることを表している。

  • タグの出現数
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回出現と同じ設定になる。

ちなみに属性の出現数は 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 で定義できる。

桁数を定義するには 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 属性を使用する。

上記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)
名前: コメント:




| 新しいページ | 編集 | 差分 | 編集履歴 | ページ名変更 | アップロード | 検索 | ページ一覧 | タグ | RSS | ご利用ガイド | 管理者に問合せ |
@wiki - 無料レンタルウィキサービス | プライバシーポリシー