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

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

順不同・任意のタグ

前半は、順番とおりの必須タグで、後半は順不同の任意タグのSchemaの指定を教えてください。 以下の例では、aa,bb,ccが、この順で必須、xx,yy,zzは、この順で任意です。 xx,yy,zzを順番関係なく指定できるようにしたいです。 よろしくお願いします。 <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="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:sequence>

  • XML
  • 回答数4
  • ありがとう数5

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

  • ベストアンサー
  • 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>

関連するQ&A

  • さきほどの質問に関連して(CSVとスキーマの関連付け)

    以下の様なコードを書いています。 --------------------------------------------------------- <xsd:element name="DEN_LIST" type="ListType" /> <xsd:complexType name="ListType"> <xsd:complexContent> <xsd:restriction base="xsd:anyType"> <xsd:sequence> <xsd:element ref="DEN" maxOccurs="unbounded"/> </xsd:sequence> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:element name="DEN" type="DenpyoType"> <xsd:key name="DEN-num1"> <xsd:selector xpath="DEN" /> <xsd:field xpath="num1" /> </xsd:key> </xsd:element> <xsd:complexType name="DenpyoType"> <xsd:complexContent> <xsd:restriction base="xsd:anyType"> <xsd:sequence> <xsd:element ref="num1" /> <xsd:element ref="NAME" /> <xsd:element ref="DRCR" maxOccurs="unbounded" /> </xsd:sequence> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:element name="num1" type="xsd:string" /> <xsd:element name="NAME" type="xsd:string" /> <xsd:element name="DRCR" type="DCType"> <xsd:key name="DRCR-num2"> <xsd:selector xpath="DRCR" /> <xsd:field xpath="@num2" /> </xsd:key> </xsd:element> <xsd:complexType name="DCType"> <xsd:complexContent> <xsd:restriction base="xsd:anyType"> <xsd:sequence> <xsd:element ref="DR" /> <xsd:element ref="CR" /> </xsd:sequence> <xsd:attribute name="num2" type="xsd:string" use="required" /> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:element name="DR" type="xsd:string" /> <xsd:element name="CR" type="xsd:string" /> ----------------------------------------------------以上

    • 締切済み
    • XML
  • complexTypeは入れ子にできない?

    次のようなXML文書を実現する為のXML Schemaを伺っても宜しいでしょうか。 <Test> <A>0</A> <!-- 唯一の要素--> <B>0</B> <!-- 反復要素 --> <C>0</C> <B>0</B> <C>0</C> : : </Test> で、下記のようなXML Schemaを書きましたが、文法エラーになります。 <xsd:element name="Test"><xsd:complexType><xsd:sequence> <!-- 唯一の要素 --> <xsd:element name="A" type="Int"/> <!-- 反復要素 --> <xsd:complexType><xsd:sequence> <xsd:element name="B" type="Int"/> <xsd:element name="C" type="Int"/> </xsd:sequence></xsd:complexType> </xsd:sequence></xsd:complexType></xsd:element> この解決方法をお教え頂けないでしょうか?どうか宜しくお願い致します。

    • ベストアンサー
    • XML
  • 子要素が順不同の場合のXML Schema の定義

    OpenSearch description documents の XML Schema を作成中なのです。ルート要素の <OpenSearchDescription> の各子要素について、出現回数の定義があるのですが、各要素の出現は順不同なのです。 <xsd:element name="OpenSearchDescription"> <xsd:annotation> <xsd:documentation source="https://github.com/dewitt/opensearch/blob/master/opense arch-1-1-draft-6.md#opensearch-description-elements"> The root node of the OpenSearch description document. </xsd:documentation> </xsd:annotation> <xsd:complexType> <xsd:?> <xsd:element ref="ShortName" minOccurs="1" maxOccurs="1" /> <xsd:element ref="Description" minOccurs="1" maxOccurs="1" /> <xsd:element ref="Tags" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Contact" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Url" minOccurs="1" maxOccurs="unbounded" /> <xsd:element ref="LongName" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Image" minOccurs="0" maxOccurs="unbounded" /> <xsd:element ref="Query" minOccurs="0" maxOccurs="unbounded" /> <xsd:element ref="Developer" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Attribution" minOccurs="0" maxOccurs="1" /> <xsd:element ref="SyndicationRight" minOccurs="0" maxOccurs="1" /> <xsd:element ref="AdultContent" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Language" minOccurs="0" maxOccurs="unbounded" /> <xsd:element ref="OutputEncoding" minOccurs="0" maxOccurs="unbounded" /> <xsd:element ref="InputEncoding" minOccurs="0" maxOccurs="unbounded" /> </xsd:?> <xsd:anyAttribute namespace="##any" processContents="skip" /> </xsd:complexType> </xsd:element> 具体的には上記のような内容なのですが、xsd:? の部分にどのように記述すればよいでしょうか。 sequence, choice, all のどれを使用しても上手くいきません。解決方法をご教示頂ければ幸いです。

    • ベストアンサー
    • XML
  • PHPでXMLデータ生成、スキーマで失敗

    PHPのDOMDocumentを使ってXMLデータを生成しています。 $dom->schemaValidate('xsdファイル'); で失敗してしまします。 どうしても原因がわからないので吐き出すデータを最小限にして試してみましたが状況が変わりませんでした。 スキーマは以下のようになっています。 <?xml version="1.0" encoding="Shift_JIS" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Response"> <xsd:complexType> <xsd:sequence> <xsd:element name="user" type="user_type" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="user_type"> <xsd:sequence> <xsd:element name="developerID" type="xsd:string" /> <xsd:element name="operation" type="xsd:string" /> <xsd:element name="User-Agent" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema> そして吐き出されるxml形式のデータは、 <?xml version="1.0" encoding="Shift-JIS"?> <Response> <user> <developerID>testdeveloperID</developerID> <operation>testoperation</operation> <User-Agent>Mozilla/5.0 (Windows NT 6.0; rv:7.0.1) Gecko/20100101 Firefox/7.0.1</User-Agent> </user> </Response> 出てしまうエラーは、 Warning: DOMDocument::schemaValidate() [<a href='domdocument.schemavalidate'>domdocument.schemavalidate</a>]: The document has no document element. in "実行しているphpファイルのパス" on line 12 ちなみに実行phpの12行目には、 $dom->schemaValidate('xsdファイル'); があります。 スキーマを使用してのxmlデータ吐き出しは初めてなのでいろいろと戸惑っています。 何か解決方法もしくはエラーが出てしまう原因をご存知の方がいらっしゃいましたらアドバイスをいただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • XML
  • PHPでXMLデータ生成、スキーマで失敗

    PHPのDOMDocumentを使ってXMLデータを生成しています。 $dom->schemaValidate('xsdファイル'); で失敗してしまします。 どうしても原因がわからないので吐き出すデータを最小限にして試してみましたが状況が変わりませんでした。 スキーマは以下のようになっています。 <?xml version="1.0" encoding="Shift_JIS" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Response"> <xsd:complexType> <xsd:sequence> <xsd:element name="user" type="user_type" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="user_type"> <xsd:sequence> <xsd:element name="developerID" type="xsd:string" /> <xsd:element name="operation" type="xsd:string" /> <xsd:element name="User-Agent" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema> そして吐き出されるxml形式のデータは、 <?xml version="1.0" encoding="Shift-JIS"?> <Response> <user> <developerID>testdeveloperID</developerID> <operation>testoperation</operation> <User-Agent>Mozilla/5.0 (Windows NT 6.0; rv:7.0.1) Gecko/20100101 Firefox/7.0.1</User-Agent> </user> </Response> 出てしまうエラーは、 Warning: DOMDocument::schemaValidate() [<a href='domdocument.schemavalidate'>domdocument.schemavalidate</a>]: The document has no document element. in "実行しているphpファイルのパス" on line 12 ちなみに実行phpの12行目には、 $dom->schemaValidate('xsdファイル'); があります。 スキーマを使用してのxmlデータ吐き出しは初めてなのでいろいろと戸惑っています。 何か解決方法もしくはエラーが出てしまう原因をご存知の方がいらっしゃいましたらアドバイスをいただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • SQL ServerのXMLスキーマがうまくいきません。

    「SQL Server 2005 Express」を使用しています。 次のようなスキーマをサーバーに登録して CREATE XML SCHEMA COLLECTION dbo.schema_test AS N'<?xml version="1.0" encoding="UTF-16"?> <xsd:schema targetNamespace="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" xmlns:xsd="http://www.w3.org/2001/XMLSchema" > <xsd:element name="root">  <xsd:complexType mixed="true">   <xsd:choice>    <xsd:element name="A" type="xsd:string" />    <xsd:element name="B" type="xsd:string" />    <xsd:element name="C" type="xsd:string" />   </xsd:choice>  </xsd:complexType> </xsd:element> </xsd:schema>' ; つぎのようなクエリを試したのですが、 「メッセージ 6913、レベル 16、状態 1、行 5 XML 検証: 要素 'root' の宣言が見つかりませんでした。場所: /*:root[1]」 というエラーメッセージが表示されてしまいます。 DECLARE @xml xml (dbo.schema_text) SET @xml = '<root> <A>AAA</A> <B>BBB</B> <C>ooo</C> </root> ' どなたか分かる方がいらっしゃいましたら、 アドバイスをお願いいたします。

  • sheet1(1月)からsheet12(12月)をsheet13(H17年度)に集計したい

    sheet1(1月) A   B  C 1 得意先  銀行  金額 2 aa社 xx 50 3 cc店 yy 30 4 ee社 xx 20 sheet2(2月)   A B C 1 bb zz 50 2 ee xx 30 3 cc yy 50 4 dd ww 30 目的のsheet sheet13(H17年度) A     B    C    D 1 得意先  1月   2月   3月 2 aa社   50   3 bb社 50 4 cc社 30 50 5 dd社 30 6 ee社 20 30

  • タグが閉じてないというエラーについて

    タグチェックをすると、下記のようなコメントが出ます。 "<!--" が現れたのに "-->" が最後まで現れなかったときの警告です。コメントを入れ子にしたりして、どこか間違えたのでしょう。 ・下記のスクリプトは、フリーのスクリプトをもらってきたものです。 タグは閉じられてるはずなのに、何故このようなメッセージが出るのでしょう? どこがいけないのか教えてください。 <SCRIPT type="text/javascript"> <!-- xx = escape(document.referrer); yy = ""; for (i = 0; i < xx.length; i++) { zz = xx.charAt(i); yy += (zz == "+") ? "%2B" : zz; } document.write('<IMG WIDTH=84 HEIGHT=16 '); document.write('SRC="./count.cgi'); document.write('?gif+ref+', yy, '">'); //--><IMG WIDTH=84 HEIGHT=16 SRC="./count.cgi?gif" ALT="counter" ALIGN=BOTTOM> </SCRIPT>

  • 深い要素の取り出し方

    下のような場合、一般的にはforeachを使うと思いますが、 $sample[cc]->[0]->[xx]の要素である「さ」だけを取り出す場合はどのようにしたら取り出せるのでしょうか? $sample [aa] => あ [bb] => か [cc] => Array   (    [0] => Array     (      [xx] => さ      [yy] => た     )    [1] => Array     (      [xx] => な      [yy] => は     )   )

    • ベストアンサー
    • PHP
  • SQL構文を手助けしてください

    (1)のようなテーブルデータを(2)のように表示したいと思います。 AA,BB,CC,DD,EEは列名としてください。 (1) AA BB CC DD EE __________________________ 00 01 2004/01/01 XX YY 01 00 2004/01/01 XE YD 01 00 2004/01/05 XZ YZ 02 01 2004/01/10 X2 YE 02 02 2004/01/05 XW YI 02 02 2004/01/06 XF YL (2) AA BB CC DD EE __________________________ 00 01 2004/01/01 XX YY 01 00 2004/01/05 XZ YZ 02 01 2004/01/10 X2 YE 02 02 2004/01/06 XF YL <条件> AAとBBでキーを作り、CCのMAXの該当レコードを表示したい。 SELECT AA,BB,MAX(CC),DD,EE FROM TEST_TABLE GROUP BY AA,BB というような感じかなと思ったのですが、「GROUP BY の式ではありません」と怒られてしまいます。 どなたか簡単なやり方をご存知で無いでしょうか?

専門家に質問してみよう