2011-07-05 50 views
2

我想设计一个XML结构来捕获包含客户名称和许多不同数量列的电子表格的输出。还有一排排。如何使用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 =“无界”第一复杂类型,其中在第二复杂类型,我已经离开它意思是它只会出现一次。这会正常工作吗?我需要许多行的客户数量和总数量只有一行。

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

  3. 有没有更好的方法来构造单独的行和结构的总体类型?

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

有什么想法?

回答

2
  1. 正确,maxOccurs适用于整个组。

  2. 正确,组名只在模式中。

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

  4. 似乎合理;您仍然保持威尼斯百叶窗可重用组件的精神,而不必为本地元素提供名称空间。