
前半は、順番とおりの必須タグで、後半は順不同の任意タグの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>
No.4ベストアンサー
- 回答日時:
[No.3] のお礼の質問に対する回答ね。
「MSVでは、OKになりますが、PHPではエラーに なります。 もし、この事情が分かるなら、教えて下さい。」
エラーを出す PHP が正しいよ。
xsd:all は、使用制限が二つあって、
1) xsd:complexType のはじめの子要素で、唯一の子要素にしかなれない。
2) xsd:all のなかで、sequence や group のようなグループ要素はつかえない。
なので、『できないけど。』ということ。
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>
時間が空いてしまって、すみません。
同じ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を変換させました)。
ありがとうございます。
こっちです。でも、こんなに面倒な指定になってしまうのは、残念です。
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回以上の繰り返しを許す子要素」と解釈しています。
ありがとうございます。
でも、これだと、以下の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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- その他(プログラミング・Web制作) seleniumbasic chrome操作について 1 2023/03/29 15:40
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Haskell: foldrの使用について
-
PINGをHPから送信するには?
-
element of surprise
-
linuxにおけるネットワーク設定...
-
XSLでXMLデータをタブ区切りデ...
-
探索二分木をバランス化する。
-
SAXの一例を教えて下さい
-
XPathでできるか確認
-
ツリーでのアイコンの設定
-
ポインタと構造体
-
ゆっくりムービーメーカーで作...
-
xsl:sortを子要素で
-
自動的にリンクを貼る・・・
-
東芝のDynabookなのですがアン...
-
【C# LINQ】 MAX値と一緒に・・・
-
[データ構造・アルゴリズム] B...
-
2分探索木の高さを求めるプロ...
-
CPUの考え方を教えてください ...
-
IUnknown_QueryService ?
-
変数宣言について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PerlによるXMLからCSVへの変換...
-
エクセルVBAのFunctionプロシー...
-
順不同・任意のタグ
-
属性リスト宣言
-
内容にテキストを持つタグの属...
-
XML の属性部分を JavaScript ...
-
PHPでXMLデータ生成、スキーマ...
-
XMLファイルからXML Schemaを参...
-
最低1つの要素が存在するグルー...
-
XMLのネームスペースの指定・変...
-
計算問題が分かりません… どな...
-
XMLスキーマのrefの使い方
-
Eclipse でBASIC認証するには
-
XMLで主キーを自動的に入力する...
-
CPUの考え方を教えてください ...
-
東芝のDynabookなのですがアン...
-
バッチファイルでテキストファ...
-
ルート要素ノードが2個ある場合?
-
SNMP リンクダウンとノードダ...
-
XMLで要素が記述された順番に意...
おすすめ情報