gpt4 book ai didi

c++ - XSD : How to make a polymorphic "list"?

转载 作者:数据小太阳 更新时间:2023-10-29 02:32:30 26 4
gpt4 key购买 nike

我正在尝试构建一个元素类型,该元素类型保留 change 元素类型的列表,该元素类型是其他几个子类型的基本类型。我得到了这段代码:

<xs:complexType name="change_list" >
<xs:annotation>
<xs:documentation>List of changes.</xs:documentation>
</xs:annotation>

<xs:sequence>
<xs:choice minOccurs="1" maxOccurs="unbounded" >

<xs:element name="change" type="aos:change" >
<xs:annotation>
<xs:documentation>Generic or specific type of change.</xs:documentation>
</xs:annotation>
</xs:element>

<xs:element name="activate" type="aos:activate" >
<xs:annotation>
<xs:documentation>Change that will activate an element or do nothing if already activated.</xs:documentation>
</xs:annotation>
</xs:element>

<xs:element name="deactivate" type="aos:deactivate" >
<xs:annotation>
<xs:documentation>Change that will deactivate an element or do nothing if already deactivated.</xs:documentation>
</xs:annotation>
</xs:element>

<xs:element name="switch" type="aos:switch" >
<xs:annotation>
<xs:documentation>Change that will activate the element if deactivated or deactivate it if activated.</xs:documentation>
</xs:annotation>
</xs:element>

<xs:element name="transform" type="aos:transform" >
<xs:annotation>
<xs:documentation>
Change that will modify the geometric state of the element
by applying one or several geometric transformations.
</xs:documentation>
</xs:annotation>
</xs:element>


</xs:choice>
</xs:sequence>

我正在使用 CodeSynthesis 生成 C++ 代码。

现在,这似乎有点过分了,因为我们在这里明确定义了对不同类型的访问。我想我想要的是更简单的东西,比如:

更改列表。

    <xs:sequence>
<xs:choice minOccurs="1" maxOccurs="unbounded" >

<xs:element name="change" type="aos:change" >
<xs:annotation>
<xs:documentation>Generic or specific type of change.</xs:documentation>
</xs:annotation>
</xs:element>

</xs:choice>
</xs:sequence>

现在不允许我对不同的子类型的更改使用不同的标签。所以我想也许一个好的解决方案可能是使用 substitution group .

但那样我就失去了使用特定子类型的属性和元素的能力。

原始解决方案是否适合这样做(有一个基类型对象列表也可以获取子类型)?

最佳答案

不知道您是否还需要答案...但以下架构可以满足您的需求。

首先是基本类型和两个具体子类型(确保您的基类设置了 abstract="true"):

<xs:complexType abstract="true" name="BaseTask">
<xs:sequence>
<xs:element name="Name" type="xs:string" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="ConcreteTask1">
<xs:complexContent>
<xs:extension base="BaseTask">

</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="ConcreteTask2">
<xs:complexContent>
<xs:extension base="BaseTask">
<xs:sequence>
<xs:element name="Description" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

然后添加一个包含 BaseTask 子类型元素的列表:

<xs:element name="TaskList">
<xs:complexType>
<xs:sequence>
<xs:element name="Tasks" minOccurs="0" maxOccurs="unbounded" type="BaseTask" />
</xs:sequence>
</xs:complexType>
</xs:element>

xml 看起来像这样:

<TaskList>
<Tasks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ConcreteTask1">
<Name>Foo1</Name>
</Tasks>
<Tasks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ConcreteTask2">
<Name>Foo2</Name>
<Description>Test</Description>
</Tasks>
</TaskList>

关于c++ - XSD : How to make a polymorphic "list"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4271976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com