如何使用xml架构组元素

时间:2011-07-05 10:50:35

标签: xsd

我正在尝试设计一个XML结构来捕获电子表格中的输出,该电子表格包含一个客户名称和许多不同数量的列。并且总共还有一行。

我有大约4个数量的列定义,我想将其作为一个组重用。因此,我声明了一个名为AmountsGroup的组,然后在我的复杂类型定义中使用Group Name作为'ref'属性。这是它的样子

<xsd:complexType name="AmountByCustomerType">
    <xsd:sequence>
        <xsd:element name="Customer" type="xsd:string" />
        <xsd:group ref="AmountsGroup" maxOccurs="unbounded"/>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="AmountByCustomerTotalType">
    <xsd:sequence>
        <xsd:element name="Total" type="xsd:string" />
        <xsd:group ref="AmountsGroup" />
    </xsd:sequence>
</xsd:complexType>

<xsd:group name="AmountsGroup">
    <xsd:sequence>
        <xsd:element name="AmountByPeriod" type="AmountByPeriodType" maxOccurs="unbounded" />
        <xsd:element name="NetAdjustments" type="xsd:decimal" />
        <xsd:element name="OriginalSalesAmount" type="xsd:decimal" minOccurs="0"/>
        <xsd:element name="RevisedAmount" type="xsd:decimal" />
    </xsd:sequence>        
</xsd:group>

以下是我的问题:

  1. 我已经在第一个复杂类型中声明该组具有maxOccurs =“unbounded”,其中在第二个复杂类型中我将其留下意味着它必须只发生一次。这会正常吗?我想要多行客户金额,只需要一个总金额行。

  2. XML实例文档不需要在任何地方都有这个组名的名称 - 这是正确的吗?

  3. 有没有更好的方法来构建单个行和结构的总类型?

  4. 当我使用百叶帘图案时,这是一个很好的做法吗?我不想声明complexType,因为那时我必须声明一个将出现在XML实例文档中的元素,从而为XML对象树添加一个级别。有没有办法使用命名类型而不给它自己的元素?我希望你明白我想做什么。

  5. 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

  1. 正确,maxOccurs适用于整个群体。

  2. 正确,组名仅在架构中。

  3. 我打算建议引入一个元素来封装组成员,但我从你的4个 th 问题中看到你试图避免这种情况。我更喜欢它,因为它使解析器更容易识别每个“行”的开始和结束,并反映编程封装。

  4. 似乎合理;你仍然坚持使用威尼斯百叶窗的可重用组件精神,而不需要为本地元素提供命名空间。