当复杂类型由另一个名称空间中的另一个模式引用时,应该使用什么XML命名空间?

时间:2010-11-05 14:22:15

标签: xsd

假设我有一个模式在名称空间“general”中定义名为“MyType”的复杂类型

然后在另一个模式中,使用该复杂类型。

例如:

<xsd:schema targetNamespace="http://www.example.com/otherschema" 
          xmlns:general="http://www.example.com/genschema">
<xsd:import namespace="http://www.example.com/genschema" schemaLocation="general.xsd" />
<xsd:element ref="general:Mytype" />
<xsd:element name="myName" type="general:MyType" />

XML文档中符合此模式的XML元素上的命名空间是否应使用otherschema或genschema的targetNamespace。

<general:MyType />
or
<targetNamespacePrefix:Mytype />

我问这个问题是因为我使用Axis2来生成与Web服务交互的java代码。 Axis2代码对命名空间进行了检查,在上面的示例中,它将检查命名空间是否为常规命名空间,如果不是,则抛出异常。当然,Web服务响应xml使用targetNamespace而不是通用名称空间,因此每次都会中断。我对Axis2开发人员的信心远远超过Web服务的开发人员,但我想在提交错误报告之前确保我写信。

1 个答案:

答案 0 :(得分:0)

您在“其他”架构中使用MyType是正确的:声明命名空间,使用import并使用声明的前缀(general)。

<xsd:schema targetNamespace="http://www.example.com/otherschema" 
              xmlns:general="http://www.example.com/genschema">
    <xsd:import namespace="http://www.example.com/genschema" schemaLocation="general.xsd" />
    <xsd:element name="myName" type="general:MyType" />
</xsd>

请注意,我明确指出您的http://...项目,以清楚在您描述的情况下哪些项目通常不同。

如果您询问定义MyType的架构,请在该架构中使用未加前缀的名称作为定义:

<xsd:schema targetNamespace="http://www.example.com/genschema" 
    <xsd:complexType name="MyType"> ... </xsd:complexType>
</xsd:schema>

根据您的修改进行更新:

在XML实例文档中,myName的使用将具有“otherschema”的命名空间,即上面的targetNamespace。使用MyType将使用“genschema”命名空间。

我删除了<xsd:element ref="general:MyType"/>,只有当MyType是一个元素(不是一个类型)并且它在一个类型定义中时才有意义。假设“otherschema”包含:

<xsd:complexType name="otherType>
    ...
    <xsd:element ref="general:MyElement"/>
</xsd:complexType>

在这种情况下,MyElement仍然会在XML实例文档中使用“genschema”命名空间。

底线:导入项目不会更改其命名空间。但是,包含它们确实会更改命名空间(即使用<xsd:include>

相关问题