- PR -

XMLSchemaで要素値の最大長をバイト数で制限したい

1
投稿者投稿内容
由紀恵
会議室デビュー日: 2005/06/08
投稿数: 2
投稿日時: 2005-06-08 23:20
XML初心者の由紀恵といいます。

XMLSchemaで、string型の要素値の最大長(maxLength)を、文字数でなくバイト数で制限する方法を探しています。
下記のようなXMLSchemaファイルとXMLファイルがあった場合、<empname>の要素値の最大長を4バイトに制限して、
"Mike"(4バイト)はOKだが、"マイク"(6バイト)はNGにしたいのです。
しかし、どうやっても"Mike"(4文字)、"マイク"(3文字)とカウントしてしまうようで、どちらもOKになってしまいます。

いわゆる半角文字と全角文字が混在する文字列の最大長を制限する場面は多々あると思いますが、皆さんどのようにされているのでしょうか?
ご存知の方がいましたらご教授ください。よろしくお願いします。

コード:
--XMLSchemaファイル-----------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="emplist">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="emp" type="emp_type" minOccurs="0" maxOccurs="unbounded" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:complexType name="emp_type">
        <xsd:sequence>
            <xsd:element name="empno" type="xsd:int" />
            <xsd:element name="empname" type="empname_type" />
        </xsd:sequence>
    </xsd:complexType>
    <xsd:simpleType name="empname_type">
        <xsd:restriction base="xsd:string">
            <xsd:minLength value="0" />
            <xsd:maxLength value="4" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>
------------------------------------------------------------------------------

--XMLファイル-----------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<emplist>
    <emp>
        <empno>1</empno>
        <empname>Mike</empname>
    </emp>
    <emp>
        <empno>2</empno>
        <empname>マイク</empname>
    </emp>
</emplist>
------------------------------------------------------------------------------

Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-06-09 08:27
正規表現を駆使するしかないかと思います。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-06-10 11:58
文字列のバイト長は、実際に使用する文字コードによって変わってしまうため、XMLスキーマ
で指定することはできないでしょう。
由紀恵
会議室デビュー日: 2005/06/08
投稿数: 2
投稿日時: 2005-06-10 13:28
アドバイスありがとうございます。
どうやら正規表現でチェックするのが懸命のようですね。

とりあえず、いわゆる全角文字を「全角漢字と全角ひらがなと全角カタカナ」、いわゆる半角文字を「半角英字と半角数字」とした場合、下記のsimpleTypeを定義すれば当初の目的は達成できることが判りました。
ただ、半角と全角が混在した要素値("マイ9"など)はチェックできません。。。
何か良いアイデアはないでしょうか。

コード:

<xsd:simpleType name="empname_type">
<xsd:restriction base="xsd:string">
<xsd:pattern value="(\p{IsCJKUnifiedIdeographs}|\p{IsHiragana}|\p{IsKatakana}){0,2}|([0-9]|[A-Z]|[a-z]){0,4}" />
</xsd:restriction>
</xsd:simpleType>



[ メッセージ編集済み 編集者: 由紀恵 編集日時 2005-06-10 13:31 ]
1

スキルアップ/キャリアアップ(JOB@IT)