元素的变量数组

XML 可以包含具有不同数量的元素的数组。 通常,包含不同数量的元素的 WSDL 文档和 XML 模式不会高效地映射到单个高级语言数据结构中。 CICS® 使用基于容器的映射或内联映射来处理 XML 中的不同数量的元素。

通过在元素声明上使用 minOccursmaxOccurs 属性,在 XML 模式中表示具有不同数量的元素的数组:
  • minOccurs 属性指定元素可以出现的最小次数。 其值可以是 0 或任何正整数。
  • maxOccurs 属性指定元素可以出现的最大次数。 它可以具有大于或等于 minOccurs 属性值的任何正整数值。 它还可以采用值 unbounded ,这指示对于元素可以出现的次数没有任何上限。
  • 这两个属性的缺省值都是 1。
示例: 表示可选的 8 字节字符串
此示例表示可选的 8 字节字符串; 即,它在应用程序 XML 或 SOAP 消息中从不出现或出现一次:
<xsd:element name="component"
  minOccurs="0" maxOccurs="1">
  <xsd:simpleType>
    <xsd:restriction base="xsd:string">
      <xsd:length value="8"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>
示例: 表示必须出现的 8 字节字符串
以下示例表示必须至少出现一次的 8 字节字符串:
<xsd:element name="component"
 minOccurs="1" maxOccurs="unbounded">
  <xsd:simpleType>
    <xsd:restriction base="xsd:string">
      <xsd:length value="8"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>
通常,包含不同数量的元素的 WSDL 文档不会高效地映射到单个高级语言数据结构中。 因此,为了处理这些情况, CICS 使用一系列已连接的数据结构,这些数据结构在一系列容器中传递到应用程序。 这些结构用作应用程序的输入和输出:
  • 当 CICS 将 XML 转换为应用程序数据时,它会使用应用程序数据填充这些结构,并且应用程序会读取这些结构。
  • 当 CICS 将应用程序数据转换为 XML 时,它将读取应用程序已填充的结构中的应用程序数据。

这些数据结构的格式最好用一系列示例来解释。 XML 可以来自 SOAP 消息,也可以来自应用程序。 这些示例使用简单 8 字节字段的数组。 然而,模型也支持复杂数据类型的数组以及包含其他数组的数据类型的数组。

固定元素数

示例: 正好出现三次的元素
以下示例说明正好出现三次的元素:
<xsd:element name="component"
  minOccurs="3" maxOccurs="3">
  <xsd:simpleType>
    <xsd:restriction base="xsd:string">
      <xsd:length value="8"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>
在此示例中,由于预先知道元素出现的次数,因此可以将其表示为简单 COBOL 声明中的固定长度数组 (或其他语言中的等效数组):
05 component PIC X(8) OCCURS 3 TIMES

映射级别 2 和更低级别的元素数量不同

示例: 可发生 1 到 5 次的必需元素
本示例说明了可出现 1 到 5 次的必需元素:
<xsd:element name="component"
  minOccurs="1" maxOccurs="5">
  <xsd:simpleType>
    <xsd:restriction base="xsd:string">
      <xsd:length value="8"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>
主数据结构包含两个字段的声明。 当 CICS 将 XML 转换为二进制数据时,第一个字段 component-num 包含元素在 XML 中出现的次数,第二个字段 component-cont 包含容器的名称:
05 component-num PIC S9(9) COMP-5
05 component-cont PIC X(16)
第二个数据结构包含对此元素自身的声明:
01 DFHWS-component
02 component PIC X(8)

您必须检查 component-num 的值 (将包含 1 到 5 范围内的值) ,以了解元素出现的次数。 元素内容位于 component-cont 中指定的容器中; 容器包含一组元素,其中每个元素都由 DFHWS-component 数据结构映射。

如果 minOccurs="0"maxOccurs="1",那么该元素是可选的。 要处理应用程序中的数据结构,必须检查 component-num 的值:
  • 如果为零,那么消息没有组件元素,并且未定义 component-cont 的内容。
  • 如果为 1,那么组件元素在 component-cont 中所指定的容器内。

容器的内容由 DFHWS-component 数据结构映射。

注: 如果 SOAP 消息由单个重现元素组成,那么 DFHWS2LS 将生成两种语言结构。 主要语言结构包含数组中元素的数量以及保存元素数组的容器的名称。 第二个语言结构映射该重现元素的单个实例。

映射级别 2.1 和更高级别的元素的不同数量

在映射级别 2.1 及更高版本上,可以在 CICS 助手中使用 INLINE-MAXOCCURS-LIMIT 参数。 INLINE-MAXOCCURS-LIMIT 参数指定用来处理可变数量的元素的方式。 不同数量的元素的映射选项是基于容器的映射,如 映射级别 2 和更低级别的元素数量差异 或内联映射中所述。 此参数的 value 可以是 0-32767 范围内的正整数:
  • INLINE-MAXOCCURS-LIMIT 的缺省值为 1 ,这将确保以内联方式映射可选元素。
  • INLINE-MAXOCCURS-LIMIT 参数的值 0 会阻止内联映射。
  • 如果 maxOccurs 小于或等于 INLINE-MAXOCCURS-LIMIT 的值,那么将使用内联映射。
  • 如果 maxOccurs 大于 INLINE-MAXOCCURS-LIMIT 的值,那么将使用基于容器的映射。
映射不同数量的元素内联将生成一个数组 (如上面的固定实例示例) 和一个计数器。 component-num 字段指示存在多少个元素实例,并且数组指向这些实例。 对于 映射级别为 2 且低于 的元素的变量数中显示的示例,当 INLINE-MAXOCCURS-LIMIT 小于或等于 5 时,生成的数据结构如下所示:
05 component-num PIC S9(9) COMP-5 SYNC.
05 component OCCURS 5 PIC X(8).

第一个字段 component-num 与上一节中基于容器的映射示例的输出相同。 第二个字段包含一个长度为 5 的数组,此长度足以包含可生成的最大数量的元素。

内联映射与基于容器的映射不同,后者存储元素的出现次数以及放置数据的容器的名称,因为它将所有数据都存储在当前容器中。 将数据存储在当前容器中通常会提高性能并使内联映射成为首选。

嵌套变量数组

复杂 WSDL 文档和 XML 模式可包含可变重现元素,而这些元素又可包含可变重现元素。 在此情况下,所描述的结构会扩展到超越这些示例中所描述的两个级别。

示例: 嵌套变量数组
此示例说明了一个名为 <component2> 的可选元素,该元素嵌套在名为 <component1> 的必需元素中,其中该必需元素可以出现 1 到 5 次:
<xsd:element name="component1"
  minOccurs="1" maxOccurs="5">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="component2"
       minOccurs="0" maxOccurs="1">
        <xsd:simpleType>
          <xsd:restriction base="xsd:string">
            <xsd:length value="8"/>
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
顶级数据结构与先前这些示例中的完全相同:
05 component1-num PIC S9(9) COMP-5
05 component1-cont PIC X(16)
但是,第二个数据结构包含以下元素:
01 DFHWS-component1
02 component2-num PIC S9(9) COMP-5
02 component2-cont PIC X(16)
第三级结构包含以下元素:
01 DFHWS-component2
02 component2 PIC X(8)

最外层元素 <component1> 的出现次数在 component1-num中。

component1-cont 中指定的容器包含一个数组,其中包含第二个数据结构 DFHWS-component1的实例数。

每个 component2-cont 实例命名一个不同的容器,每个容器都包含由第三级结构 DFHWS-component2映射的数据结构。

要说明此结构,请考虑与以下示例匹配的 XML 片段:
<component1><component2>
string1
</component2></component1>
<component1><component2>
string2
</component2></component1>
<component1></component1>
<component1> 出现三次。 前两个都包含 <component2> 的实例; 第三个实例不存在。
在顶级数据结构中, component1-num 包含值 3。 component1-cont 中指定的容器具有三个 DFHWS-component1实例:
  1. 在第一个中,component2-num 的值为 1,而 component2-cont 中指定的容器保存 string1
  2. 在第二个中,component2-num 的值为 1,而 component2-cont 中指定的容器保存 string2
  3. 在第三个中,component2-num 的值为 0,并且 component2-cont 的内容未定义。
在该实例中,完整的数据结构通过共计四个容器来表示:
  • 容器 DFHWS-DATA 中的根数据结构
  • component1-cont 中指定的容器
  • component2-cont 的前两个实例中指定了两个容器

可选结构和 xsd: choice

DFHWS2LS and DFHSC2LS support the use of maxOccurs and minOccurs on <xsd:sequence>, <xsd:choice>, and <xsd:all> elements only at mapping level 2.1 and above, where the minOccurs and maxOccurs attributes are set to minOccurs="0" and maxOccurs="1".

助手会生成映射,这些映射会将这些元素视为其中的每个子元素都是可选的。 使用这些元素实现应用程序时,请确保应用程序未生成选项的无效组合。 每个元素在生成的语言结构中都有自己的 count 字段,这些字段必须全部设置为 "0" 或全部设置为 "1"。 Any other combination of values is invalid, except for with <xsd:choice> elements.

<xsd:choice> elements indicate that only one of the options in the element can be used. 它在所有映射级别都受支持。 The assistants handle each of the options in an <xsd:choice> as though it is in an <xsd:sequence> element with minOccurs="0" and maxOccurs="1". Take care when you implement an application using the <xsd:choice> element to ensure that invalid combinations of options are not generated by the application. 每个元素在生成的语言结构中都有自己的 count 字段,其中一个必须设置为 "1" ,其他元素必须全部设置为 "0"。 Any other combination of values is invalid, except when the <xsd:choice> element is itself optional, in which case it is valid for all the fields to be set to '0'.