0

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

<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 引用为 Category-type 是否会要求我再次在 XML 中编写 Category-type,它本身具有 ParentCategory 子元素等...导致无限类型引用。

4

1 回答 1

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 中链接到父节点很容易。

于 2013-06-09T22:18:14.213 回答