
前半は、順番とおりの必須タグで、後半は順不同の任意タグの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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
順不同・任意のタグ
-
CPUの考え方を教えてください ...
-
SNMP リンクダウンとノードダ...
-
ノードとは
-
複数のマックPCによる数値計算...
-
バッチファイルでテキストファ...
-
XML、XSLTの適応エラー(IEから...
-
動的な構造体配列の初期化
-
このエラー、何とかなりません...
-
ルート要素ノードが2個ある場合?
-
XMLファイル内のデータ(値)を変...
-
質問
-
東芝のDynabookなのですがアン...
-
VBAでXMLを出力するプログラム...
-
特殊記号が勝手にエスケープさ...
-
u_shortなどの省略した宣言につ...
-
タグの有無の判定
-
[C#]テキストボックスに入力し...
-
TreeView と DOMツリー
-
XSLTにてタグ名を取得する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Haskell: foldrの使用について
-
計算問題が分かりません… どな...
-
属性リスト宣言
-
Eclipse でBASIC認証するには
-
XMLファイルからXML Schemaを参...
-
PHPでXMLデータ生成、スキーマ...
-
内容にテキストを持つタグの属...
-
順不同・任意のタグ
-
XML の属性部分を JavaScript ...
-
XMLのネームスペースの指定・変...
-
CPUの考え方を教えてください ...
-
東芝のDynabookなのですがアン...
-
ルート要素ノードが2個ある場合?
-
SNMP リンクダウンとノードダ...
-
XMLで要素が記述された順番に意...
-
Excel-VBAでXMLの複数ノードの...
-
複数のマックPCによる数値計算...
-
XML、XSLTの適応エラー(IEから...
-
バッチファイルでテキストファ...
-
同じタグ名の項目取得
おすすめ情報