如何在xs:all中创建xs:choice - (xsd:schema)

时间:2013-08-27 15:10:31

标签: xsd xsd-validation

我想验证数据如下面的数组:

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_namelast_name将永远在那里,我怎么能把它们(女孩,男孩)作为选择或选择。我更愿意使用xs:all,因此元素顺序不应成为问题。

我对此link进行了评论,以便尝试在xs:all内使用选项,但无法使其正常运行。我很感激任何回应。谢谢。

3 个答案:

答案 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建议的那样。如果您不想这样做(为什么不呢?),那么您剩下的选项包括:

  • 声明一个抽象元素gender_id,将其放入all-group,并将boy_id和girl_id声明为其替换组;
  • 将封闭元素从'xml'重命名为'girl'或'boy'以显示您是否正在与女孩或男孩打交道的信息

毫无疑问,其中一些人会觉得Java程序员不习惯,其中一些人会觉得XML用户不习惯。

相关问题