gpt4 book ai didi

xml - JIBX:如何使用多个目标命名空间?

转载 作者:行者123 更新时间:2023-12-04 16:56:31 27 4
gpt4 key购买 nike

我正在使用 JIBX 来将我的 XML 数据映射到 Java 对象。当 XML 只包含一个目标命名空间时,这非常有效。不幸的是,需求已经改变,现在我得到了包含两个不同命名空间的 XML 数据。

例子:

<a:foo> 
<b:bar>Simple Example</b:bar>
</a:foo>

我的问题是,如何编写一个产生两个不同目标命名空间的 xsd?
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="namespace_of_a"
xmlns:a="namespace_of_a"
xmlns:b="namespace_of_b"
elementFormDefault="qualified">

<xs:element name="foo">
<xs:complexType>
<xs:sequence>

<!-- this won't work, because b is part of a different namespace -->
<xs:attribute type="xs:string" use="required" name="bar"/>

</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

我已经尝试过:
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="namespace_of_a"
xmlns:a="namespace_of_a"
xmlns:b="namespace_of_b"
elementFormDefault="qualified">

<xs:element name="foo">
<xs:complexType>
<xs:sequence>

<!-- this won't work, because jibx is reporting that targetNamespace is an unknown attribute -->
<xs:attribute targetNamespace="namespace_of_b" type="xs:string" use="required" name="bar"/>

</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

请帮忙。我不确定这在一般情况下是否可行?提前致谢!

最佳答案

是的,这是可能的。这是 XSD 旨在处理的核心场景之一。

(1) 为涉及的每个命名空间编写单独的模式文档,该命名空间指定为 targetNamespacexs:schema元素。

如果您的 a:foo元素只能接受 b:bar元素作为子元素,然后在 a 的架构文档中您将要导入命名空间 b ,使内容模型为 a:foo可引用元素b:bar .例如,修改您的示例架构文档以包括:

<xs:import namespace="namespace_of_b"/>

(注意:有些人会在这里添加 schemaLocation 提示;我不会。)

然后更改 a:foo的声明读书:
<xs:element name="foo">
<xs:complexType>
<xs:sequence>
<xs:element ref="b:bar"/>
</xs:sequence>
</xs:complexType>
</xs:element>

a:foo可以接受任何东西,然后使用 xs:any在其内容模型中使用通配符,并且您不需要导入命名空间 b (因为你没有提到其中的任何内容)。

在命名空间 b 的架构文档中定义元素 bar以正常方式(或属性 bar - 我认为您一定已经改变了如何呈现示例的想法)。

(2) 编写一个简单的顶级“驱动程序”架构文档,导入您在步骤 1 中准备的两个特定于命名空间的架构文档。它位于 xs:import 上。此处声明我将提供架构位置信息。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:import namespace="namespace_of_a" schemaLocation="a.xsd"/>
<xs:import namespace="namespace_of_b" schemaLocation="b.xsd"/>
</xs:schema>

将有关模式文档的物理位置的信息隔离到单个驱动程序文件中,在短期内会使问题复杂化,因为需要另一个模式文档。但它避免了当你想稍微改变一些东西时出现的一些令人讨厌的问题,以后。

关于xml - JIBX:如何使用多个目标命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12035867/

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