首页 > 解决方案 > XSD 抽象类型可能不在 XML 中生成

问题描述

这是一个通用的 XSD 验证问题。我正在尝试使 XSD 架构适应现有的 XML。让我们有以下 XML 分支:

<briefing>
   <date/>
   <supplier/>
   <customer/>
   ...
   <q>question 1</q>
   <a>answer 1</a>
   <q>question 2</q>
   <a>answer 2</a>
   ...
</briefing>

现在,对于每个简报,我可以有 1 个客户、1 个供应商和 N 对问答:如果 a 想要控制这对 q+a,我应该创建一个包含并包含在序列中的元素<qa>,每个都有。但是如果元素在 XML 中不可用怎么办?我想创建一个“抽象”元素(或组),这样父抽象元素根本不会生成,但它的子元素仍然可以与其属性(某种虚拟元素)一起出现。无论如何,抽象元素和组都没有以这种方式得到验证,我在规范中找不到类似的东西...... 所以最后,我们可以对这些元素说些什么?maxOccurs=unbounded<q>+<a>minOccurs=maxOccurs=1<qa><qa>

是否每个 XSD 父元素都必须出现在 finally XML 中才能使其子元素也出现在其中?

标签: xmlxsdabstract

解决方案


您需要做的是将 q 和 a 元素放在 minOccurs 0 和 maxOccurs 设置为值或无界的序列下,如下所示。

<?xml version="1.0" encoding="utf-16"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="briefing">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="date" nillable="true" type="xs:date" />
        <xs:element name="supplier" type="xs:string" />
        <xs:element name="customer" type="xs:string" />
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
          <xs:element name="q" type="xs:string" />
          <xs:element name="a" type="xs:string" />
        </xs:sequence>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

这将非常愉快地解析

<briefing>
  <date>1999-05-31</date>
  <supplier>supplier_0</supplier>
  <customer>customer_0</customer>
  <q>question 1</q>
  <a>answer 1</a>
  <q>question 2</q>
  <a>answer 2</a>
</briefing>

或者

<briefing>
  <date>1999-05-31</date>
  <supplier>supplier_0</supplier>
  <customer>customer_0</customer>
</briefing>

推荐阅读