XML模式 - 复杂的验证

时间:2010-08-08 20:14:16

标签: xml xsd

鉴于是关注XML文件:

 <root>
  <customers>
    <customer name="CustomerA" orders="111,222" />
  </customers>

  <orders>
    <order ID="111">
      <description text="Some bananas ..." />
    </order>

    <order ID="222">
      <desciption text="good coffee" />
    </order>

  </orders>

</root>

现在我想验证customer元素的orders属性。所有订单都用逗号加注......所以,非常简单。

这是否可以使用模式文件?

1 个答案:

答案 0 :(得分:0)

修改

我认为你所追求的是大致如下的东西,虽然因为它使用了id,这意味着他们需要与docuement一样独特,所以你不能得到一个order.id和一个customer.id是相同的 - 不确定如果有办法解决这个问题。您也可以使用xsd:IDREFS来做,就像您在我原先的例子中所说的那样,但我个人更喜欢这样...

   <xsd:complexType name="Customer">
      <xsd:attribute name="customerId" type="xsd:ID" use="required"/>
      <xsd:attribute name="name" type="xsd:string" use="required"/>
   </xsd:complexType>

   <xsd:complexType name="Order">
      <xsd:sequence>
         <xsd:element name="text" type="xsd:string"/>
         <xsd:attribute name="customerId" type="xsd:IDREF" use="required"/>
         <xsd:attribute name="id" type="xsd:ID" use="required"/>
      </xsd:sequence>
   </xsd:complexType>

   <xsd:element name="customers>
       <xsd:sequence>
           <xsd:element name="customer" type="CustomerType" />
       </xsd:sequence>
   </xsd:element>
   <xsd:element name="orders">
     <xsd:sequence>
         <xsd:element name="order" type="OrderType" />
     </xsd:sequence>
   </xsd:element>

如果我是你,我会做类似的事情:

<root>
  <customers>
    <customer id="unique-customer-id" name="CustomerA" />
  </customers>
  <orders>
    <order id="222" customerId="unique-customer-id" text="Some Bananas..." />
  </orders>
</root>

您可以制作模式以确保order.customerId对应于customer.id我认为这样可以使查找和转换更容易。当然,如果订单只是客户的孩子,你可以让它更容易,但我确定你必须有其他要求,这使得这个过于冗长或不明智。