我应该如何在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子元素等,导致无限类型引用。
答案 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。