我试图针对xsd模式验证xml,而不是使用从WSDL到Java的序列化到从我们的WSDL文件派生的Java类型。
我们的最外面的元素标签是在WSDL中定义的,但是我们需要针对xsd模式进行验证,因此我们尝试将最外面的元素标签添加到xsd。但是,当最外层包装器包含的名称空间与xsd文件的targetNamespace不同时,xml就会通过验证。
<ns6:responseWrapper
xmlns="http://somewhere.com/types/2016/A"
xmlns:ns6="http://somewhere.com/operations/2016/A"
>
<user>
<id>the_id</id>
<someInfo>the_source</someInfo>
</user>
</ns6:responseWrapper>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://somewhere.com/types/2016/A"
targetNamespace="http://somewhere.com/types/2016/A"
elementFormDefault="qualified"
>
<xsd:element
xmlns:ns6="http://somewhere.com/operations/2016/A"
name="responseWrapper"
type="tns:ResponseWrapper"
/>
<xsd:complexType name="ResponseWrapper">
<xsd:element name="user" type="tns:User"/>
</xsd:complexType>
<xsd:complexType name="User">
<xsd:sequence>
<xsd:element name="id" type="xsd:string"/>
<xsd:element name="someInfo" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
上面的xml和架构会生成Cannot find the declaration of element 'ns6:responseWrapper` errors.
我想修改架构,以便xml成功验证。
答案 0 :(得分:1)
通常,如果元素在两个不同的命名空间中,则需要在由xs:import链接的不同XSD模式文档中定义它们。
XSD 1.1中有一个例外,它允许您在本地元素声明上使用targetNamespace属性,但是它有很多限制,以至于我认为它并不经常使用。
在xmlns:ns6="http://somewhere.com/operations/2016/A"
声明上放置一个额外的名称空间声明,例如xs:element
是完全合法的,但对架构的含义绝对没有影响,除非ns6
前缀实际上在一个QName。