- PR -

Schemaで型の定義

投稿者投稿内容
いろは
常連さん
会議室デビュー日: 2005/05/11
投稿数: 31
投稿日時: 2006-08-09 14:04
C#で出力したXMLに対してのスキーマを定義したいと思っています。
日時の所で組み込み型と出力された内容が違ってしまったので、型を新たに定義したいのですが、書き方が分かりません。

<datetime>2006/08/09 00:00:00</datetime>

を表現したいのですが、patternだけでなく値のチェックまで出来ればと思うのですが、
どのようにしたら良いのでしょうか?
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2006-08-11 14:00
http://www.utj.co.jp/xml/dev/schema/dxsch_2.html
http://www.atmarkit.co.jp/fxml/tecs/025xsd/25.html
独自のデータ型の作り方は上記リンクで理解できると思います。
値のチェックもpatternで事足りるはず。正規表現だし。

ところで、.netのDateTime型をシリアライズしたら「2006/08/09 00:00:00」て書式で出力されちゃって、しゃーないからこの書式に合わせたデータ型を作るかってかんじですか?
この書式にこだわらないのであれば、Thread.CurrentThread.CurrentCultureのDateTimeFormatでxsdのdateTime型と一致する書式にしてあげたら、独自のデータ型を定義する必要ないかも。(.netのDateTime型のシリアライズの際の書式はDateTimeFormatから持ってきてるかどうかは未確認です。)

追加:
xsdのdateTime型の書式にするのは、XmlElementAttribute.DataType プロパティ にdateTimeを指定するだけでいいのかも・・・

[ メッセージ編集済み 編集者: かめたろ 編集日時 2006-08-11 14:10 ]
いろは
常連さん
会議室デビュー日: 2005/05/11
投稿数: 31
投稿日時: 2006-08-17 09:50
かめたろさん 回答ありがとうございます。
返信遅れまして申し訳ありません。(夏休みでした。。)

引用:

かめたろさんの書き込み (2006-08-11 14:00) より:
値のチェックもpatternで事足りるはず。正規表現だし。



どうやらやりたいことはスキーマというより正規表現で何とかすると言った感じなのですかね。
値のチェックまで正規表現でやるということはかなり細かくパターンを記述するという具合なのでしょうか。高度な正規表現の使い方が出来ていないようです。。

引用:

ところで、.netのDateTime型をシリアライズしたら「2006/08/09 00:00:00」て書式で出力されちゃって、しゃーないからこの書式に合わせたデータ型を作るかってかんじですか?



はい。まさにその通りです。
書式にこだわりは無いのですが、既にリリースされている物なので^^;
ちゃんとスキーマ付けておいてあげた方が良いかなというところから始まった話なので、とりあえずもう少し頑張ってみようと思います。

いろは
常連さん
会議室デビュー日: 2005/05/11
投稿数: 31
投稿日時: 2006-08-17 16:58
長ったらしくなりましたが、以下の様に書いてみました。
もっとスマートに書けるんですかね?私の今のスキルではこれが限界。。^^;
2月のうるう年判定とかまで出来たら完璧なんですけどね。

<xs:simpleType name="DateTime">
<xs:restriction base="xs:string">
<xs:pattern value="\\d{4}/((((0[13578])|(1[02]))/((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|(11))/((0[1-9])|([12][0-9])|(30)))|(02/((0[1-9])|([12][0-9])))) ((0[1-9])|(1[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])" />
</xs:restriction>
</xs:simpleType>
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2006-08-18 09:40
うぉっ、すごいですね。日付チェックなんて正規表現でちょろっとできるだろうって思って無責任な発言をしてしまったことを後悔してます。スミマセン・・・。(だって、ファセットのmin〜やmax〜は今回の場合使えないっぽいし) 書式と数字の範囲がだいたい表現できてりゃいいだろう程度の認識でした。私の頭では、いろはさんのこのパズルのような正規表現を読み解くことすらできねぇっス。

ここまで厳密にやらねばならないってことは、ユーザーさんがXMLをいじったりするのですか?例えば、このxsdをmsのinfopathに取り込んで使うとか。

きっと誰かが考えてくれているはずと思い検索・・・【正規表現】【datetime】
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=21099&forum=7
このスレッドのにしざきさんのトコのリンク
いろは
常連さん
会議室デビュー日: 2005/05/11
投稿数: 31
投稿日時: 2006-08-21 13:48
かめたろさん ありがとうございます!
にしざきさんのサイト見てみました。
すごいです。頑張って解読してみました。うるう年まで出来そうです!!
また時間を作って自分で書いたヤツを直してみようと思います。

引用:

かめたろさんの書き込み (2006-08-18 09:40) より:
ここまで厳密にやらねばならないってことは、ユーザーさんがXMLをいじったりするのでか?



いいえ。。前にも書き込みましたように『付けてあげた方が良いかな?』がスタートです。
文章で書いておくよりスキーマの方が分かりやすいかと思ったのですが、結局説明文が必要になりそうな表現になっちゃいましたし…
勉強というか息抜きというか興味本位で頑張ってみました ^^;

ちなみに私の表現は30日までの月と31までの月、プラス2月をパターンとし月日はゼロ詰めするようになってます。で、その後ろにスペース1つ入れて24時間表示の表現をくっつけた形になっています。
いろは
常連さん
会議室デビュー日: 2005/05/11
投稿数: 31
投稿日時: 2006-08-29 15:09
時間が取れたので、うるう年判定までやってみました。
正規表現だけでは非常に分かりにくくなってしまいましたが。。。
軽くテストした感じだといけてると思います。

<xs:simpleType name="DateTime">
<xs:restriction base="xs:string">
<xs:pattern value="(((\\d{4,})/((((0[13578])|(1[02]))/((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|(11))/((0[1-9])|([12][0-9])|(30)))|(02/((0[1-9])|([12][0-8])))))|((\\d{2,2}((0[48)|([13579][26])|([2468][048])))|((\\d*)(([0248][0248])|([13579][26]))00)/02/29)) ((0[1-9])|(1[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])" />
</xs:restriction>
</xs:simpleType>
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2006-08-29 15:55
(((\d{4,})/((((0[13578])|(1[02]))/((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|(11))/((0[1-9])|([12][0-9])|(30)))|(02/((0[1-9])|([12][0-8])))))|((\d{2,2}((0[48)|([13579][26])|([2468][048])))|((\d*)(([0248][0248])|([13579][26]))00)/02/29)) ((0[1-9])|(1[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])

400の倍数判定がおかしいため
以下の年月の結果がおかしくなります

マッチしてしまう例
2200/02/29 01:01:01

アンマッチになってしまう例
1996/02/29 01:01:01
6000/02/29 01:01:01
6400/02/29 01:01:01

参考リンク
http://nishi.exblog.jp/1917647/
http://oraclesqlpuzzle.hp.infoseek.co.jp/regex/regex-4-3.html
http://jeanne.wankuma.com/tips/datetime/isleapyear.html

[ メッセージ編集済み 編集者: 明智重蔵 編集日時 2006-08-29 15:57 ]

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