引用另一个XML父complexType?

时间:2013-06-09 06:19:12

标签: xsd complextype

我应该如何在xml中引用另一个complexType,作为我自己定义的Key的元素或属性?为以下自我引用建模的正确方法是什么?第一种方法是可能的,还是会导致无限的自我参照?

<xs:complexType name="Category">
  <xs:sequence>
    <xs:element name="ParentCategory" type="Category" minOccurs="1" maxOccurs="1"></xs:element>
    <xs:element name="ChildCategory" type="Category" minOccurs="0" maxOccurs="unbounded"></xs:element>
  </xs:sequence>
  <xs:attribute name="CategoryName" type="xs:string"></xs:attribute>
</xs:complexType>

<xs:complexType name="Category">
  <xs:sequence>
    <xs:element name="ChildCategory" type="Category" minOccurs="0" maxOccurs="unbounded"></xs:element>
  </xs:sequence>
  <xs:attribute name="CategoryName" type="xs:string"></xs:attribute>
  <xs:attribute name="ParentCategory" type="xs:string"></xs:attribute>
</xs:complexType>

我有点困惑 - 因为我想要面向对象,但我不确定它在XML中会是什么样子。作为类型类型,ParentCategory的引用不会要求我再次在XML中编写一个Category类型,它本身有一个ParentCategory子元素等,导致无限类型引用。

1 个答案:

答案 0 :(得分:2)

引用与类型定义的一部分相同类型的元素没有问题,所以从这个角度来看,你的第一个例子很好。尝试引用父类有点奇怪,你不应该真的需要这样做......毕竟XML是分层的。

<xs:complexType name="Category">
  <xs:sequence>
    <xs:element maxOccurs="unbounded" minOccurs="0" name="ChildCategory" type="Category"/>
  </xs:sequence>
  <xs:attribute name="CategoryName" type="xs:string"/>
</xs:complexType>

Category类型以递归方式引用自身,允许0个或更多ChildCategory元素。这应该做你需要的(XML Schema中的递归类型引用没有任何问题)。

如果需要在文档中引用父类别,则可以很容易地链接到任何DOM实现中的父节点或使用XPath。