假设我有一个模式在名称空间“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服务的开发人员,但我想在提交错误报告之前确保我写信。
答案 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>
。