我想验证数据如下面的数组:
input_array = array(
"boy"=> array("boy_id"=>1),
"first_name=>"First Name",
"last_name"=>"Last Name"
);
在input_array里面,第一个索引可以用girl array替换为
"girl"=>array("girl_id"=>2)
我想创建xsd以验证信息,如下所示:
<xs:element name="xml">
<xs:complexType>
<xs:all>
<xs:element ref="boy" minOccurs="0"/>
<xs:element ref="girl" minOccurs="0"/>
<xs:element ref="first_name"/>
<xs:element ref="last_name"/>
</xs:all>
</xs:complexType>
</xs:element>
问题 - 我想确保有男孩或女孩的信息,first_name
和last_name
将永远在那里,我怎么能把它们(女孩,男孩)作为选择或选择。我更愿意使用xs:all
,因此元素顺序不应成为问题。
我对此link进行了评论,以便尝试在xs:all
内使用选项,但无法使其正常运行。我很感激任何回应。谢谢。
答案 0 :(得分:3)
在您引用的文章中(http://www.w3.org/wiki/Needs_choice_inside_all) 他们提供了一个替代组的例子。那么,为什么不使用一个?
以下是它的外观:
<xs:element name="xml">
<xs:complexType>
<xs:all>
<xs:element ref="gender" minOccurs="1"/>
<xs:element ref="first_name"/>
<xs:element ref="last_name"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="gender" abstract="true"/>
<xs:element name="boy" substitutionGroup="gender"> ... </xs:element>
<xs:element name="girl" substitutionGroup="gender"> ... </xs:element>
具体来说,我尝试了这个完整的架构:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="xml">
<xs:complexType>
<xs:all>
<xs:element ref="gender" minOccurs="1"/>
<xs:element ref="first_name"/>
<xs:element ref="last_name"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="gender" abstract="true"/>
<xs:element name="boy" substitutionGroup="gender"/>
<xs:element name="girl" substitutionGroup="gender"/>
<xs:element name="first_name" type="xs:string"/>
<xs:element name="last_name" type="xs:string"/>
</xs:schema>
验证此XML:
<?xml version="1.0" encoding="UTF-8"?>
<xml>
<girl/>
<first_name>Lara</first_name>
<last_name>Croft</last_name>
</xml>
有效!那样,如果我指定<girl/>
代替<boy/>
,它也会通过,
但是当<girl/>
没有<boy/>
或其中任何一个都没有时,就没有了。
答案 1 :(得分:1)
你可以尝试这段代码吗?
<xsd:complexType name="column">
<xsd:all>
<xsd:element ref="gender" minOccurs="1"/>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xsd:all>
</xsd:complexType>
<xsd:element name="gender">
<xsd:complexType>
<xsd:choice>
<xs:element name="boy" type="xs:integer" default="1"/>
<xs:element name="girl" type="xs:integer" default="0"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
答案 2 :(得分:1)
最简单的方法可能是将boy_id和girl_id重命名为性别(具有适当的属性值),如@herry建议的那样。如果您不想这样做(为什么不呢?),那么您剩下的选项包括:
毫无疑问,其中一些人会觉得Java程序员不习惯,其中一些人会觉得XML用户不习惯。