2010-08-08 61 views
1

给出的下面的XML文件: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> 

现在我要验证的订单客户元素属性。所有订单都以逗号分隔......因此,非常简单。

这可能与模式文件?

回答

0

编辑

我觉得什么youre是后东西大致像下面,但因为这使用的ID,这意味着它们需要使你不能ahve的order.id和客户是唯一withing的docuement .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,我认为这样做可以使查找和转换更容易。当然,如果订单只是客户的孩子,那么你可以更容易,但是确保你必须有其他的要求,使得这个过于冗长或不合理。

+0

我认为你的代码片段和我的一样。但问题是,如何验证这一点。 – Carnation 2010-08-08 20:54:51

+0

如果有,但以不同的方式..如果我记得(和它已经有一段时间,因为我创建了架构或使用xml比配置文件更多),您可以链接要验证的实体元素作为引用另一个元素。 – prodigitalson 2010-08-08 21:12:08

+0

你能解释我吗,我该怎么做,或者可以发表一个例子? :) – Carnation 2010-08-08 21:41:14