• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:順不同・任意のタグ)

順番とおりの必須タグと順不同の任意タグのSchemaの指定方法

このQ&Aのポイント
  • 順不同の任意タグを順番関係なく指定する方法を教えてください。
  • Schemaの指定をする際に、順不同の任意タグの順序を制約しない方法について教えてください。
  • xsd:sequenceを使用して、順不同の任意タグを指定する方法について知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • dscripty
  • ベストアンサー率51% (166/325)
回答No.4

[No.3] のお礼の質問に対する回答ね。 「MSVでは、OKになりますが、PHPではエラーに なります。 もし、この事情が分かるなら、教えて下さい。」 エラーを出す PHP が正しいよ。 xsd:all は、使用制限が二つあって、 1) xsd:complexType のはじめの子要素で、唯一の子要素にしかなれない。 2) xsd:all のなかで、sequence や group のようなグループ要素はつかえない。 なので、『できないけど。』ということ。

guci-ok
質問者

お礼

ありがとうございます。 自分の理解の低さが分かりました。 精進を重ねて行きたいと思います。

その他の回答 (3)

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.3

つまり <xds:sequence>   <xsd:element name="aa" type="xsd:string"/>   <xsd:element name="bb" type="xsd:string"/>   <xsd:element name="cc" type="xsd:string"/>   <xsd:all>     <xsd:element name="xx" type="xsd:string" minOccurs="0" />     <xsd:element name="yy" type="xsd:string" minOccurs="0" />     <xsd:element name="zz" type="xsd:string" minOccurs="0" />   </xsd:all> </xsd:sequence> のようなことをしたいということだよね。 できないけど。 『[No.2] のお礼』より引用 > こんなに面倒な指定になってしまうのは、残念です。 > Schemaの弱いところでしょうか。 う~ん。今回の XML の設計がそもそも気持ち悪いかなぁ。 xx, yy, zz は type が xsd:string だし、最大で1つで、順番が任意なら、属性でいい気がする。 あとは、xx, yy, zz を別の要素の子要素にするか、かな? <xsd:complexType>   <xsd:sequence>     <xsd:element name="aa" type="xsd:string"/>     <xsd:element name="bb" type="xsd:string"/>     <xsd:element name="cc" type="xsd:string"/>     <xsd:element name="options" type="Options"/>   </xsd:sequence> </xsd:complexType> <xsd:complexType name="Options">   <xsd:all>     <xsd:element name="xx" type="xsd:string" minOccurs="0" />     <xsd:element name="yy" type="xsd:string" minOccurs="0" />     <xsd:element name="zz" type="xsd:string" minOccurs="0" />   </xsd:all> </xsd:complexType>

guci-ok
質問者

お礼

時間が空いてしまって、すみません。 同じXSDが、 MSVでは、OKになりますが、PHPではエラーになります。 もし、この事情が分かるなら、教えて下さい。 PHPでの作成を目指しています。 C:\tmp\20120311>java -jar C:\msv\msv.jar a3.xsd a3.xml スキーマを読み込んでいます... 検証しています: a3.xml 文書は妥当(valid)です C:\tmp\20120311>c:\xampp\php\php.exe -v PHP 5.3.8 (cli) (built: Aug 23 2011 11:50:20) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies C:\tmp\20120311>c:\xampp\php\php.exe test3.php Warning: DOMDocument::schemaValidate(): Invalid Schema in C:\tmp\20120311\test3. php on line 10 E1 code(3033) line(9) column(0) message(Element '{http://www.w3.org/2001/XMLSche ma}sequence': The content is not valid. Expected is (annotation?, (element | gro up | choice | sequence | any)*). ) level(2) file(file:///C:/tmp/20120311/a3.xsd) <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="root"> <xsd:complexType> <xsd:sequence> <xsd:element name="aa" type="xsd:string" /> <xsd:element name="bb" type="xsd:string" /> <xsd:element name="cc" type="xsd:string" /> <xsd:all> <xsd:element name="dd" type="xsd:string" minOccurs="0" maxOccurs="1" /> <xsd:element name="ee" type="xsd:string" minOccurs="0" maxOccurs="1" /> <xsd:element name="ff" type="xsd:string" minOccurs="0" maxOccurs="1" /> </xsd:all> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>

回答No.2

抜けがありました。  <xsd:choice minOccurs="0"> ではなく,  <xsd:choice minOccurs="0" maxOccurs="unbounded"> でないといけませんね。 ただし,DTDでの表記が <!ELEMENT foo (aa, bb, cc, (dd | ee | ff)?)> ではなく, <!ELEMENT foo (aa, bb, cc, ((dd, ((ee, ff?) | (ff, ee?)?)) | (ee, ((ff, dd?) | (dd, ff?)?)) | (ff, ((dd, ee?) | (ee, dd?)?)) )? ) > であるならば (dd/ee/ffは順不同で,各要素は最大ひとつ), <?xml version="1.0" encoding="utf-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <xsd:element name="foo">   <xsd:complexType>    <xsd:sequence>     <xsd:element ref="aa" />     <xsd:element ref="bb" />     <xsd:element ref="cc" />     <xsd:choice minOccurs="0" maxOccurs="1">      <xsd:sequence>       <xsd:element ref="dd" />       <xsd:choice>        <xsd:sequence>         <xsd:element ref="ee" />         <xsd:element minOccurs="0" maxOccurs="1" ref="ff" />        </xsd:sequence>        <xsd:sequence minOccurs="0" maxOccurs="1">         <xsd:element ref="ff" />         <xsd:element minOccurs="0" maxOccurs="1" ref="ee" />        </xsd:sequence>       </xsd:choice>      </xsd:sequence>      <xsd:sequence>       <xsd:element ref="ee" />       <xsd:choice>        <xsd:sequence>         <xsd:element ref="ff" />         <xsd:element minOccurs="0" maxOccurs="1" ref="dd" />        </xsd:sequence>        <xsd:sequence minOccurs="0" maxOccurs="1">         <xsd:element ref="dd" />         <xsd:element minOccurs="0" maxOccurs="1" ref="ff" />        </xsd:sequence>       </xsd:choice>      </xsd:sequence>      <xsd:sequence>       <xsd:element ref="ff" />       <xsd:choice>        <xsd:sequence>         <xsd:element ref="dd" />         <xsd:element minOccurs="0" maxOccurs="1" ref="ee" />        </xsd:sequence>        <xsd:sequence minOccurs="0" maxOccurs="1">         <xsd:element ref="ee" />         <xsd:element minOccurs="0" maxOccurs="1" ref="dd" />        </xsd:sequence>       </xsd:choice>      </xsd:sequence>     </xsd:choice>    </xsd:sequence>   </xsd:complexType>  </xsd:element>  <xsd:element name="aa" type="xsd:string" />  <xsd:element name="bb" type="xsd:string" />  <xsd:element name="cc" type="xsd:string" />  <xsd:element name="dd" type="xsd:string" />  <xsd:element name="ee" type="xsd:string" />  <xsd:element name="ff" type="xsd:string" /> </xsd:schema> のようになります (Visual Studio 2010でDTDを変換させました)。

guci-ok
質問者

お礼

ありがとうございます。 こっちです。でも、こんなに面倒な指定になってしまうのは、残念です。 Schemaの弱いところでしょうか。

回答No.1

<xsd:sequence>  <xsd:element name="aa" type="xsd:string" />  <xsd:element name="bb" type="xsd:string" />  <xsd:element name="cc" type="xsd:string" />  <xsd:choice minOccurs="0">   <xsd:element name="dd" type="xsd:string" />   <xsd:element name="ee" type="xsd:string" />   <xsd:element name="ff" type="xsd:string" />  </xsd:choice> </xsd:sequence> こんな感じでしょうか。 # U+3000はU+0020等へ置き換えてください。 なお,「任意タグ」を,「0回以上の繰り返しを許す子要素」と解釈しています。

guci-ok
質問者

お礼

ありがとうございます。 でも、これだと、以下のXMLは、要素「ee」が余計と怒られます。 dd, ee, ff 全部指定してもよいようにしたい。 <?xml version="1.0"?> <root> <aa>aaa</aa> <bb>bbb</bb> <cc>ccc</cc> <ff>fff</ff> <ee>eee</ee> </root>