【问题标题】:Validating only part of XML document using schema?使用模式仅验证 XML 文档的一部分?
【发布时间】:2011-01-02 13:15:04
【问题描述】:

是否可以编写允许将经过验证的 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 模式来做到这一点,这样就可以更容易地与开发人员交流他们需要提供哪些元数据以及以哪种格式 - 对于活动来说,这是不可能的,因为每个活动都有自己的一组应用于这些的字段和规则。这样的事情能做到吗?

(我想到的一个解决方案是用一组&lt;data&gt; 元素而不是命名元素填充记录,然后在架构中对&lt;data&gt; 有一个非常松散的定义......但这需要改变规范)

【问题讨论】:

    标签: xml validation schema xsd


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以在架构中使用 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>
      

      【讨论】:

      • 正是我想要的。我一直在寻找要在元素上设置的属性以禁用验证,但这更有意义。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      相关资源
      最近更新 更多