使用模式仅验证XML文档的一部分?

时间:2010-01-07 15:45:16

标签: xml validation schema xsd

是否可以编写一个模式,允许将经过验证的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>进行非常宽松的定义..但这需要改变规格)

2 个答案:

答案 0 :(得分:7)

您可以在架构中使用Any类型。

例如

<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 :(得分:0)

您可以将经过验证和未经验证的内容放在不同的名称空间中,并为未经验证的内容提供相当开放的架构。