0

这将是一篇很长的文章,感谢您的准备:-) 这个问题来自这篇文章的一个更高级别的“观点”:

将元信息存储到类属性

我们有一个 XSD,我们将从(C#/Java)生成类。所以问题分为两个不同的部分:在 XSD 中定义它,然后从中创建数据模型。

我们希望在复杂类型中包含一些元素来携带元信息,但只是在 XSD 中的某些 x 路径中。这意味着当一个类型被重用为另一个复杂类型中的元素时,我们想告诉用户它是否与某些东西“相关”(我在另一篇文章中称其为安全相关)。相关性在几个层次上表示。(该解释当然也适用于 C#/Java 中的数据模型)

XSD 类型示例:

<xs:complexType name="Core">
  <xs:sequence>
    <xs:element name="No" type="xs:int" />
  </xs:sequence>
</xs:complexType>

<xs:complexType name="ComplexA">
  <xs:sequence>
    <xs:element name="Info" type="Core" />
  </xs:sequence>
</xs:complexType>

<xs:complexType name="ComplexB">
  <xs:sequence>
    <xs:element name="Info" type="Core" />
  </xs:sequence>
</xs:complexType>

核心类型具有属性“否”。此属性可能与其他类型相关。例如,它应该是 type 中的“relevant-level-1” ComplexA.Info,而在 ComplexB.Info 中不是。

我们想出了两种不同的方法来实现这一点:

1:在类型级别引入一个属性:

<xs:complexType name="ComplexA">
  <xs:sequence>
    <xs:element name="Info" type="Core" />
  </xs:sequence>
  <xs:attribute name="Relevance.Info.No" type="RelevanceType" fixed="Relevance1"/>
</xs:complexType>

<xs:simpleType name="RelevanceType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="Relevance1" />
    <!-- Some more relevance values -->
  </xs:restriction>
</xs:simpleType>

属性“Relevance.Info.No”基本上告诉成员“Info”中的属性“No”具有相关类型“Relevance1”。这种方法显然有一些缺点。类生成非常复杂,因为我们必须手动处理这些属性信息。一个解决方案发布在开头提到的线程中。

2:为每个具有相关级别的属性引入另一种复杂类型:

这将解决这种“元数据”附加到属性的方式,但显然会为类型中相关级别的每个组合在 XSD 和 C#/Java 上生成很多类。

正如您可以想象的那样,在 C# 和 Java 端创建数据模型的问题与 XSD 中的问题非常相似。最好的方法是让 XSD 准备好自动创建 java 类 (JaxB) 和 C# 类 (XGen),而无需对生成的代码进行任何其他操作(我现在正在这样做)。

您认为实现这一目标的任何其他可能性吗?

任何帮助表示赞赏!

4

2 回答 2

0

在这种情况下,我相信您需要使用继承。如果您定义了另一种类型CoreBase,并且如果您继承此类型Core

您可以使用CoreinComplexA并且可以使用CoreBaseinComplexB

<xs:complexType name="CoreBase">
  <xs:sequence>
    ... some attributes or how ever you wish
  </xs:sequence>
</xs:complexType>

<complexType name="Core">
    <complexContent>
        <extension base="CoreBase">
            <sequence>
                <xs:element name="No" type="xs:int" />
            </sequence>
        </extension>
    </complexContent>
</complexType>

<xs:complexType name="ComplexA">
  <xs:sequence>
    <xs:element name="Info" type="Core" />
  </xs:sequence>
</xs:complexType>

<xs:complexType name="ComplexB">
    <xs:sequence>
        <xs:element name="Info" type="CoreBase" />
    </xs:sequence>
</xs:complexType>

请参阅xml架构Xsd和继承中的继承链接

于 2012-10-21T06:54:42.937 回答
0

正如我在对答案的评论中所说的那样,我认为没有一个干净的解决方案。也许 XML 不打算像这样使用。
但我仍然对其他解决方案感兴趣......

于 2012-11-20T08:46:51.780 回答