gpt4 book ai didi

xml - 可以用多种可能的复杂类型重载 XSD 元素吗?

转载 作者:数据小太阳 更新时间:2023-10-29 01:48:25 25 4
gpt4 key购买 nike

我有一个定义事件 记录的架构,该记录用于在发布/订阅场景中的两个系统之间传送消息。该事件包含一个“有效负载”元素 event_data,其中包含消息的详细信息。复杂的是,有效载荷可以是 30 多种类型中的任何一种,每种类型都在其自己的 XSD 中定义。

例如(精简):

<event>
<event_name>new_phone_number</event_name>
<event_data>
<areacode>303</areacode>
<number>555-1212</number>
<extension>31</extension>
</event_data>
</event>

在这种情况下,event_dataphone_number 类型,它在导入的 XSD 的其他地方定义。但我想做的是使用相同的机制来承载其他种类的结构化消息数据。例如,可能是工作变动事件,定义为 job_details 类型:

<event>
<event_name>new_job</event_name>
<event_data>
<job_title>CEO</job_title>
<start_date>01/01/2012</start_date>
<location>Main Office</location>
</event_data>
</event>

存储在 event_data 元素中的内部记录属于 job_details 类型,如导入的 XSD 中所定义。 事件类型的“外部”记录只不过是一种承载“内部”记录中包含的有效负载的方式。

到目前为止,我已经研究了三种攻击方法,每种方法都有问题:

  1. 使用“选择”结构列出所有可能的记录类型。问题似乎是让选择列表中的所有条目共享相同的元素名称不是自然的 xml/xsd。

  2. 我想与其尝试在 event_data 元素中包含结构化子记录,不如让一个可选属性反射(reflect)所有可能的子记录类型。当然,每个都有一个唯一的名称,因此您将有一个属性用于 new_phone_number,一个属性用于 new_job,等等。除了这里潜在的可维护性和丑陋问题外,我不确定如何在事件的给定实例中强制传递一个且只有一个属性。我可以接受,但这会使代码变得脆弱。

  3. 有人通过建议使用联合回答了类似的问题 - 但这似乎只适用于简单类型。不会涵盖我的用例。

难住了!任何指导?

最佳答案

您可以通过在您的实例文档中使用 xsi:type 覆盖来做到这一点。 XML 处理器无法“推断”类型,您需要提供它。示例:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<event>
<event_name>new_phone_number</event_name>
<event_data xsi:type="PhoneNumberData">
<areacode>303</areacode>
<number>555-1212</number>
<extension>31</extension>
</event_data>
</event>
</root>

请注意,您必须定义一个基本的复杂类型 EventData 并且 PhoneNumberData 必须从中派生,才能正常工作。

关于xml - 可以用多种可能的复杂类型重载 XSD 元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6604262/

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