2010-01-07 74 views
3

是否可以编写一个模式,以允许将经验证的XML与格式良好的XML混合?恰当的例子是数据传输应用程序,其中请求包含一系列元数据(我们希望验证)和特定于记录的信息(这些信息在业务逻辑中与XML分开验证,因为XML请求是只是请求可以通过的几种方式之一)。仅使用模式验证XML文档的一部分?

例子:

<request> 
    <campaign>CAMP00001</campaign> 
    <username>user_bob</username> 
    <token>one-time-token-goes-here</token> 
    ... more meta-data ... 
    <records> 
     <record id="90209"> 
      <name>John Doe</name> 
      <address>Park Lane 191</address> 
      <postal>99999</postal> 
     </record> 

     <record id="90210"> 
      <name>Jane Doe</name> 
      <address>Park Lane 192</address> 
      <postal>88888</postal> 
     </record> 
    </records> 
</request> 

目前,我通过竞选,用户名和标记字段的内容的存在和有效性手动检查验证。如果可能的话,我希望使用XML模式来做到这一点,以便与开发人员交流他们需要提供哪些元数据以及以何种格式进行交流 - 对于活动来说,这是不可能的,因为每个活动都有自己的一套字段和适用于这些规则的规则。能做这样的事情吗?

(一个解决方案,我认为是填补记录了一组<data>元素,而不是命名元素,然后有在架构<data>一个非常宽泛的定义..但会要求各地改变规格)

回答

7

您可以在模式中使用任何类型。

对于实施例

<xs:element name="foo"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="first" type="xs:string"/> 
      <xs:element name="second" type="xs:string"/> 
      <xs:any minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

这需要每个foo的元件具有第一和第二节点,然后允许任何其他元素。例如:

<foo> 
    <first>Hello</first> 
    <second>World</second> 
    <other>can be anything</other> 
    <nodes/> 
</foo> 
+1

正是我在找的东西。我一直在一个属性的方向上搜索元素以禁用验证,但这更有意义。谢谢! – kander 2010-01-07 16:03:44

+0

@ kander:没问题 – 2010-01-07 16:08:28

0

你可以把在不同的命名空间的验证和未经验证的东西,并为未验证的内容相当广泛开放的架构。