XML 扩展继承 Mendix 平台

跳到主要内容

映射文档中的 XML 扩展继承

映射文档 Mendix 帮助连接您的 Mendix 应用程序可以连接到其他系统,例如外部 Web 服务。 Mendix 6.1 映射文档已得到显著改进,您可以在 这个博文.

在映射文档中,您可以定义如何在 Mendix 基于 XML 架构或 WSDL 文档的对象和 XML。此类架构可以通过将复杂类型定义为另一个复杂类型的扩展来包含继承关系。我们称之为 XML 继承,这是本篇博文的主题。

Mendix 长期以来,它部分支持 XML 继承,但在 6.1 版本中,它完全支持 XML 继承。这很重要,因为一些广泛使用的标准使用 XML 继承(例如,用于贸易伙伴之间电子交换保险数据的 ACORD 电子数据标准)。

从现在开始,我们要求您映射到域模型中的继承结构,类似于 XML 架构中定义的继承结构。您还需要决定要映射哪些子类型。由于这些更改,我们现在可以在导入和导出映射中支持特定父类型的混合列表。在本文中,我将解释如何使用新功能。

1. XML 继承示例

在本文中,我将使用以下 XML 模式作为示例:


<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="https://www.w3.org/2001/XMLSchema">

	<xsd:complexType name="PersonType" abstract="true">
		<xsd:sequence>
			<xsd:element name="Name" type="xsd:string"/>
			<xsd:element name="Address" type="xsd:string" minOccurs="0" />
		</xsd:sequence>
	</xsd:complexType>

	<xsd:complexType name="CustomerType">
		<xsd:complexContent>
			<xsd:extension base="PersonType">
				<xsd:sequence>
					<xsd:element name="Company" type="xsd:string"/>
				</xsd:sequence>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="EmployeeType">
		<xsd:complexContent>
			<xsd:extension base="PersonType">
				<xsd:sequence>
					<xsd:element name="Salary" type="xsd:int"/>
				</xsd:sequence>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:element name="root">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="Person" type="PersonType" maxOccurs="unbounded"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

</xsd:schema>

该架构有一个根元素,其中有一个名为 Person 的元素,其类型为“PersonType”,出现一次或多次。“PersonType”是一种抽象类型,这意味着无法创建“PersonType”类型的对象。有两种类型扩展了“PersonType”:“EmployeeType”和“CustomerType”。因此,根据此 XML 架构,有效的 XML 是客户和员工的混合列表,其中至少有一个条目。下面显示了一个包含 3 个条目的示例 XML:一个员工、一个客户和另一个员工:


<?xml version="1.0" encoding="UTF-8"?>
<root>
    <Person xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:type="EmployeeType">
        <Name>employee1</Name>
        <Address>somewhere</Address>
        <Salary>12</Salary>
    </Person>
    <Person xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:type="CustomerType">
        <Name>customer1</Name>
        <Address>somewhereElse</Address>
        <Company>companyA</Company>
    </Person>    
    <Person xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:type="EmployeeType">
        <Name>employee2</Name>
        <Address>somewhereElseAltogether</Address>
        <Salary>12000000</Salary>
    </Person>
</root>

在 XML 中,员工和客户位于“Person”标签中,并通过指定 xsi:type 属性来指定类型。它们具有共同的姓名和地址属性,并分别使用薪水和公司对其进行扩展,如 XML 架构中所述。

2. 选择元素屏幕中的 XML 继承

如果要在 XML 架构中创建映射 Mendix首先,您需要创建一个 XML Schema 文档并导入该 XML Schema。然后,您需要创建一个导入或导出映射文档并单击“选择元素”。接下来,您需要在选择元素屏幕中选择 XML Schema,然后您将看到如图 1 所示的屏幕。

图 1. 使用我们的示例 XML 模式选择导出映射的元素屏幕

在选择树中,我们看到三个级别。首先是“根”级别。其次是继承级别,它表示 XML 模式中名称为 Person 且类型为“PersonType”的元素。在第三级中,显示了“PersonType”的所有允许子类型。在本例中,这意味着“CustomerType”和“EmployeeType”。如果“PersonType”在 XML 模式中不是抽象的,那么它在这里也可用。您在此处选中的所有类型都将出现在映射文档中。当在微流中调用映射时,您在映射中包含的每种类型都将被导出或导入(取决于文档类型)。您选择不选择的类型的对象将被默默忽略。因此,按照现在的选择,映射将仅导出类型为“CustomerType”而不是类型为“EmployeeType”的人员。同样,如果当前选择是针对导入映射进行的,则映射将忽略传入 XML 中类型为“EmployeeType”的所有对象。

在图 1 中,您还可以看到许多元素被选中,并且由于复选框被禁用,因此无法取消选中。对于根节点和继承节点,这是事实,因为它们是必需的:它们必须出现一次(根)或至少一次(继承)。对于“CustomerType”,情况就是如此,因为对于每个选定的继承节点,必须至少选择一个子节点。当您还选择“EmployeeType”节点时,就可以取消选中“CustomerType”(参见图 2)。

图 2. 选择元素屏幕:还选择了“EmployeeType”

3. 导出映射中的 XML 继承

当您选择上一节显示的选择屏幕中的所有元素并按“确定”时,您将看到图 3 所示的导出映射文档。

XML 继承 空导出映射

图 3. 带有继承元素的空导出映射

导出映射如何工作?导出映射的目标是将 Mendix 对象拖入 XML 文档(或 XML 文档的一部分)。在图 3 的右侧,您可以看到在选择元素屏幕中选择的元素。这就是我们要创建的 XML 结构。在左侧,您需要指定需要使用哪些实体和属性来创建该 XML 结构以及如何获取这些实体和属性。您可以通过从连接器菜单中将实体(在域模型中定义)拖到占位符上来选择实体。随后,您可以双击拖入的实体,选择通过关联或微流获取对象,并选择从 Mendix 您拖入的实体应映射到 XML 元素中的哪些属性。如何配置导出映射的详细说明请参见 本博客文章的第 4 章有关映射文档.

为了展示这一切如何适用于继承映射元素,我将引导您完成示例的导出映射。首先,请参见图 4,了解我将使用的域模型。在图中,您可以看到“Collection”实体与“Person”实体具有 1..* 关联。“Person”实体有两个字符串属性:“name”和“Address”。最后,有两种实体类型使用“Person”作为其泛化:“Employee”具有整数属性“Salary”,而“Customer”具有字符串属性“Company”。

XML 继承领域模型

图 4. 示例的域模型

现在我们要将域模型中的实体与导出映射中的 XML 元素连接起来。最终结果如图 5 所示,我将在下面进行解释。

XML 继承领域模型

图 5. 完成的导出映射

当你从微流调用导出映射时,你传递一个 Mendix 要转换为 XML 的对象。此实体的类型应与 Mendix 您选择映射到映射文档根的对象。我们在那里拖入了“Collection”实体,因此当您调用此映射时,您应该传递一个 Mendix 类型为“Collection”的对象。调用映射时,将创建一个名为“root”的 XML 元素。下一级是类型为“PersonType”的继承元素。我们在这里拖入了“Person”实体。继承级别映射元素不同于常规映射元素,因为它不会创建 XML 元素(这就是为什么没有为该级别绘制箭头的原因)。相反,它用于为此 XML 元素的所有允许子类型指定共享的父类型。在此示例中,我们拖入了“Person”实体,因为这是我们在其下方拖入的“Employee”和“Customer”实体的父级,以映射到“CustomerType”和“EmployeeType”XML 元素。

继承映射元素与常规映射元素的不同之处在于,您只需配置如何获取对象。在示例中,我们通过“Person_Collection”关联获取对象。我们在图 6 所示的屏幕中对此进行了配置,您可以通过双击继承映射元素到达该屏幕。

获取继承映射元素的对象

图 6. 获取继承映射元素的对象

我们在这里不映射任何属性,因为继承级别映射元素不会创建 XML 元素。它仅用于指定如何获取所有允许子类型的对象和父类型。在这些子类型的映射元素中,情况正好相反。您不必指定如何获取对象,因为这已在继承级别映射元素中配置。但是,您确实需要指定如何映射属性,因为对于该类型的每个对象,都会创建一个实际的 XML 元素。在示例中,对于集合中的每个“客户”,都会创建一个“客户类型”XML 元素,其中包含“客户”中的“名称”、“地址”和“公司” Mendix 对象。对于每个“员工”,都会创建一个“员工类型” XML 元素,其中包含“员工”的“姓名”、“地址”和“薪水” Mendix 对象。我们在图 7 所示的屏幕中对此进行了配置,您可以通过双击“CustomerType”映射元素到达该屏幕。

 映射“CustomerType”XML 元素的属性

图 7. 映射“CustomerType”XML 元素的属性

4. 导入映射中的 XML 继承

当您从示例 XML 模式中选择导入映射的所有元素时,您将看到图 8 所示的导入映射文档。

带有继承元素的空导入映射

图 8. 带有继承元素的空导入映射

导入映射与导出映射类似,但存在一些重要区别。首先,箭头从右向左指向,表示 XML 元素进入系统并被转换为 Mendix 对象。因此,配置也不同于导出映射。首先,我再次将域模型中的实体(见图 4)与导入映射中的 XML 元素连接起来。最终结果如图 7 所示,我将在下面解释这一点。

已完成的导入映射

图 9. 完成的导入映射

那么导入映射有什么用呢?它接收传入的 XML 元素并将其转换为 Mendix 对象。当 XML 元素进入时,有三种方法可以获取对象:“创建新对象”、“通过键查找”和“调用微流”。在图 9 中,您可以看到箭头上方的“创建新对象”,每个级别的箭头都对应一个 Mendix 需要获取对象。这意味着我们创建一个新的空 Mendix 对象,然后我们才能继续映射的下一步。随后,属性被映射到获得的 Mendix 对象在映射中如何配置它(在类似于图 7 的屏幕中)。最后,您可以选择设置与父对象的关联。如何配置导入映射在 本博客文章的第 3 章有关映射文档.

与导出映射一样,继承级别映射元素与常规映射元素不同。只有对于继承级别元素的子元素,我们才需要指定如何获取对象(“创建新对象”、“按键查找”或“调用微流”)以及如何将属性从 XML 元素映射到 Mendix 对象。图 9 中通过不绘制继承级别元素的箭头将其可视化。是否以及需要在获取的 Mendix 对象,但是在继承映射元素中配置,因为导入的“客户”和“员工”类型的对象需要最终放在同一个集合中才能符合 XML 模式。

5. XML 继承并使用“自动映射”填充映射

当您创建新的映射文档时,最初将 XML 元素与实体、关联和属性连接起来可能非常麻烦。自动映射辅助函数将通过查找或创建域模型实体和关联并将其添加到映射中来帮助您完成此操作,从而减轻您进行大量手动工作的负担。此辅助函数还适用于继承,并将在域模型中创建所需的继承结构。请注意,如果您有部分现有域模型,如果对实体的持久性行为有影响,它将不会自动创建实体泛化。因此,使用“自动映射”功能后可能还有一些工作要做。有关更多信息,请参阅 自动映射 文档中的部分。

6. 使用 XML 继承转换带有 XML 模式的旧项目

在本节中,我将讨论如何使用 XML 继承将旧项目升级到 Mendix 6.1. 为此,我将首先展示示例 XML 模式的域模型(见图 10)、导出映射(见图 11)和导出映射(见图 11)在 Mendix 6.0 及更早版本。

 域模型例如 XML 模式 Mendix 6.0

图 10. 域模型(例如 XML 模式) Mendix 6.0

导出映射示例 XML 模式 Mendix 6.0

图 11. 导出示例 XML 模式的映射 Mendix 6.0

导入映射例如 XML 模式 Mendix 6.0

图 12. 导入示例 XML 模式的映射 Mendix 6.0

在这些图中,您会注意到集合实体与“客户”和“员工”有两个单独的关联(没有抽象的“人员”实体),并且继承级别的额外级别在映射中不存在。当我们在 Mendix 6.1 我们看到图 13 所示的一致性错误。

升级项目后出现一致性错误 Mendix 6.1

图 13. 将项目升级到 Mendix 6.1

要解决这些问题,首先右键单击前两个一致性错误,然后单击“通过从架构更新来解决”以将映射与 XML 架构重新对齐。这将更新导入映射以使其看起来像图 14,并将导出映射更新为看起来像图 15。

从架构更新后导入映射

图 14. 从模式更新后导入映射

从架构更新后导出映射

图 15. 从模式更新后导出映射

可以通过执行以下操作解决剩余的一致性错误。首先,通过引入“员工”和“客户”(“人员”)的泛化实体并与“集合”建立单一关联,将域模型更新为类似于图 4。您不再需要“员工集合”和“客户集合”关联。但请记住,如果您的应用程序中已有数据并且想要保留它,则需要在更改域模型中的关联时迁移数据。最后将“人员”实体拖到导入和导出映射中的空占位符,这样一致性错误就应该得到解决。您最终将得到如图 5 和图 9 所示的映射。

如果您只选择了继承元素的一个子类型,那么有一个技巧可以避免上述更改域模型的步骤。例如,如果您在“选择元素”对话框中只选择了“CustomerType”,则无需进行泛化(“Person”实体),而是可以在继承级别使用“Customer”实体。这是可行的,因为“Customer”就是“Customer”,并且没有选择其他需要成为“Customer”专业化的子类型。这样创建的导出映射如图 16 所示。

仅选择“CustomerType”即可导出映射

图 16. 仅选择 'CustomerType' 的导出映射

选择你的语言