繁体   English   中英

“某些”元素的XSD属性

[英]XSD attribute for “some” elements

这将是一篇很长的文章,谢谢您的准备:-)这个问题来自这篇文章的一个“观点”上层:

将元信息存储到类属性

我们有一个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>

核心类型具有属性“否”。 此属性可能与其他类型相关。 例如,它被认为是“相关级别-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),而无需对生成的代码进行任何其他操作(我现在正在做)。

您是否看到实现这一目标的其他可能性?

任何帮助表示赞赏!

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

您可以使用CoreComplexA ,你可以用CoreBaseComplexB

<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中的继承链接和继承

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM