0

我想验证以下数组中的数据:

input_array = array(
  "boy"=> array("boy_id"=>1),
   "first_name=>"First Name",
   "last_name"=>"Last Name"
);

input_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这样元素顺序不应该成为问题。

我推荐使用此链接,以便尝试在内部使用选择,xs:all但无法使其正常工作。我将不胜感激。谢谢你。

4

3 回答 3

4

在您引用的文章(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/>I 指定<boy/>,它也通过了,但是当它们既<girl/>没有<boy/>或没有在一起时也没有。

于 2013-08-27T20:18:14.847 回答
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>
于 2013-08-27T15:42:25.897 回答
1

正如@herry 所建议的,最简单的方法可能是将boy_id 和girl_id 重命名为gender(具有适当的属性值)。如果您不想这样做(为什么不呢?),那么您剩下的选择包括:

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

毫无疑问,还有其他一些,其中一些对 Java 程序员来说是惯用的,而其中一些对 XML 用户来说是惯用的。

于 2013-08-27T19:54:30.883 回答