- PR -

【XML】 条件によってスキーマ定義を変えたい

1
投稿者投稿内容
Orion
常連さん
会議室デビュー日: 2005/07/11
投稿数: 27
お住まい・勤務地: 京都府・京都市
投稿日時: 2005-07-25 09:07
また、初歩的な質問をして申し訳ありません。

以下のXMLフォーマットがあります。
<UnitParameters Type="A">
<Unit Name="AAA">
<Param ID="XXXX$1">1.0<Param>
<Param ID="YY$YYY">C0000XXXX01<Param>
</Unit>
<Unit Name="BBB">
<Param ID="UUU$1">3<Param>
<Param ID="XXXX$YYY">6.0<Param>
</Unit>
</UnitParameters>

これをスキーマでElementの型を指定したいのですが、
このままでは無理そうなので下記のように変更しました。

<UnitParameters Type="A">
<Unit Name="AAA">
<ParamFloat ID="XXXX$1">1.0<ParamFloat>
<ParamString ID="YY$YYY">C0000XXXX01<ParamString>
</Unit>
<Unit Name="BBB">
<ParamShort ID="UUU$1">3<ParamShort>
<ParamFloat ID="XXXX$YYY">6.0<ParamFloat>
</Unit>
</UnitParameters>

この方針でいいでしょうか。
それとも他に何か良い方法があるでしょうか。
「Param」elementに付く属性にはあまり規則性がないです。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-07-25 10:05
Param 要素に型を表す属性を持たせるのが、最も簡単な方法だと思いますがいかがでしょうか。

コード:
<UnitParameters Type="A">
<Unit Name="AAA">
<Param ID="XXXX" type="float">1.0</Param>
<Param ID="YY$YYY" type="string">C0000XXXX01</Param>
</Unit>
<Unit Name="BBB">
<Param ID="UUU" type="short">3</Param>
<Param ID="XXXX$YYY" type="float">6.0</Param>
</Unit>
</UnitParameters>



設計ポリシーの問題かもしれませんが、要素名が型のように副次的な情報まで含んでいるのは、私は好ましいと思いません。

もし Param の値が XML 上ではテキスト要素で表せるもののみであれば、値も属性にしてしまうとより簡単になります。
(下位構造を持つ、単純でない型も扱うならば、この方法は使えませんが(_ _))

コード:
<UnitParameters Type="A">
<Unit Name="AAA">
<Param ID="XXXX" type="float" value="1.0" />
<Param ID="YY$YYY" type="string" value="C0000XXXX01" />
</Unit>
<Unit Name="BBB">
<Param ID="UUU" type="short" value="3" />
<Param ID="XXXX$YYY" type="float" value="6.0" />
</Unit>
</UnitParameters>

Orion
常連さん
会議室デビュー日: 2005/07/11
投稿数: 27
お住まい・勤務地: 京都府・京都市
投稿日時: 2005-07-25 10:14
返信ありがとうございます。

引用:

Gioさんの書き込み (2005-07-25 10:05) より:
Param 要素に型を表す属性を持たせるのが、最も簡単な方法だと思いますがいかがでしょうか。

コード:
<UnitParameters Type="A">
<Unit Name="AAA">
<Param ID="XXXX" type="float">1.0</Param>
<Param ID="YY$YYY" type="string">C0000XXXX01</Param>
</Unit>
<Unit Name="BBB">
<Param ID="UUU" type="short">3</Param>
<Param ID="XXXX$YYY" type="float">6.0</Param>
</Unit>
</UnitParameters>



設計ポリシーの問題かもしれませんが、要素名が型のように副次的な情報まで含んでいるのは、私は好ましいと思いません。

もし Param の値が XML 上ではテキスト要素で表せるもののみであれば、値も属性にしてしまうとより簡単になります。
(下位構造を持つ、単純でない型も扱うならば、この方法は使えませんが(_ _))

コード:
<UnitParameters Type="A">
<Unit Name="AAA">
<Param ID="XXXX" type="float" value="1.0" />
<Param ID="YY$YYY" type="string" value="C0000XXXX01" />
</Unit>
<Unit Name="BBB">
<Param ID="UUU" type="short" value="3" />
<Param ID="XXXX$YYY" type="float" value="6.0" />
</Unit>
</UnitParameters>






属性に型情報を持たせるのがいいのではないかと思っているのですが、
この場合スキーマでそれぞれのelementの型まで指定できるものなのでしょうか。

Orion
常連さん
会議室デビュー日: 2005/07/11
投稿数: 27
お住まい・勤務地: 京都府・京都市
投稿日時: 2005-07-25 10:33
補足説明です。

引用:

Orionさんの書き込み (2005-07-25 09:07) より:
また、初歩的な質問をして申し訳ありません。

以下のXMLフォーマットがあります。
<UnitParameters Type="A">
<Unit Name="AAA">
<Param ID="XXXX$1">1.0<Param>
<Param ID="YY$YYY">C0000XXXX01<Param>
</Unit>
<Unit Name="BBB">
<Param ID="UUU$1">3<Param>
<Param ID="XXXX$YYY">6.0<Param>
</Unit>
</UnitParameters>

これをスキーマでElementの型を指定したいのですが、
このままでは無理そうなので下記のように変更しました。

<UnitParameters Type="A">
<Unit Name="AAA">
<ParamFloat ID="XXXX$1">1.0<ParamFloat>
<ParamString ID="YY$YYY">C0000XXXX01<ParamString>
</Unit>
<Unit Name="BBB">
<ParamShort ID="UUU$1">3<ParamShort>
<ParamFloat ID="XXXX$YYY">6.0<ParamFloat>
</Unit>
</UnitParameters>

この方針でいいでしょうか。
それとも他に何か良い方法があるでしょうか。
「Param」elementに付く属性にはあまり規則性がないです。




2番目のXMLに対応するスキーマを以下のように定義しています。

<xsd:element name="UnitParameters">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Unit" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ParamFloat" type="xsd:float"/>
<xsd:element name="ParamShort" type="xsd:short"/>
<xsd:element name="ParamString" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="ID" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="Name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2005-07-25 13:11
条件によって型を変えるということはできないと思います。

コード:
<xsd:simpleType name="paramType">
  <xsd:union memberTypes="xsd:string xsd:short xsd:float"/>
</xsd:simpleType>



これでxsd:string/xsd:short/xsd:floatどれでもいいという要素の定義はできますが、実質xsd:stringのみと変わらないので役に立ちそうにないですね。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-07-25 19:14
要素名と型は Globalに 強固に結びついていて
extension,restriction でも変えられない、baseの型に固着。
カンマ区切りのようには、扱えないのでは。

XSD 以外のメカでは 検証可能と思います。
http://www.schematron.com/

B.2.2. 属性に依存する内容モデル
http://www.kohsuke.org/relaxng/tutorial.ja.html#IDAVZZR
など

[ メッセージ編集済み 編集者: MMX 編集日時 2005-07-25 19:19 ]
DB や プログラム言語に 単純に マップできない 型を使うのは、身の破滅を招きます。
複雑な型を定義する → 相互運用に問題が出る → 問題解決に掛かりきりになる →
資産が100億でも離婚する。

XSD 持て余しの記事
Snow Season in Schemaland
http://www.oreillynet.com/lpt/wlg/7372
OAGi: "Complex type derivation by restriction simply does not work."
とか
技術者を苦しめる「悪い標準」
http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20050724/165175/

[ メッセージ編集済み 編集者: MMX 編集日時 2005-07-26 09:07 ]
1

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