有没有办法在WSDL中使用本地xsd元素

时间:2013-07-10 14:04:54

标签: xsd wsdl

我似乎无法在WSDL架构中使用本地xsd元素,因为我无法创建外部xsd(项目条件)。

<types>
    <xsd:schema xmlns:fs_req="urn:rg:fs_req" xmlns:sf_facto="urn:rg:sf_facto">
        <xsd:import namespace="urn:rg:sf_facto" schemaLocation="ROOT_sf_facto_SF_facto_V00_05.xsd" />
        <xsd:import namespace="urn:rg:fs_req"     schemaLocation="ROOT_fs_req_fs_req_V00_04.xsd" />

        <xsd:element name="getDetailsAction1" type="fs_req:fs_req_fs_req" /
        <xsd:element name="getDetailsAction1Response"      type="sf_facto:SF_facto_SF_facto"/>

    </xsd:schema>
</types>

在xsd元素的调用之下(非valide部分!)

<message name="detailMpaResponse">
    <part name="getDetail" element="tns:getDetailsAction1Response" />
</message>
<message name="detailMpaRequest">       
    <part name="getDetailResponse" element="tns:getDetailsAction1" />
</message>

我如何使用本地xsd元素获得valide wsdl?

3 个答案:

答案 0 :(得分:1)

问题在于<part>节点中的命名空间限定符。

修改

仔细观察原始帖子,我认为架构元素可能包含我们需要的值。给这个代码一个镜头:

<message name="detailMpaResponse">
    <part name="getDetail" element="fs_req:getDetailsAction1Response" />
</message>
<message name="detailMpaRequest">       
    <part name="getDetailResponse" element="sf_facto:getDetailsAction1" />
</message>

答案 1 :(得分:1)

您需要为wsdl:types中的xs:schema声明一个新的targetNamespace,并将其添加到wsdl:definitions中,如下所示:

<types>
    <xsd:schema xmlns:types="urn:rg:types" targetNameSpace="urn:rg:types" xmlns:fs_req="urn:rg:fs_req" xmlns:sf_facto="urn:rg:sf_facto">
        <xsd:import namespace="urn:rg:sf_facto" schemaLocation="ROOT_sf_facto_SF_facto_V00_05.xsd" />
        <xsd:import namespace="urn:rg:fs_req"     schemaLocation="ROOT_fs_req_fs_req_V00_04.xsd" />

        <xsd:element name="getDetailsAction1" type="fs_req:fs_req_fs_req" />
        <xsd:element name="getDetailsAction1Response" type="sf_facto:SF_facto_SF_facto"/>

    </xsd:schema>
</types>

然后将新名称空间添加到wsdl:definitions:

xmlns:types="urn:rg:types"

然后在消息部分中引用它:

<message name="detailMpaResponse">
    <part name="getDetail" element="types:getDetailsAction1Response" />
</message>
<message name="detailMpaRequest">       
    <part name="getDetailResponse" element="types:getDetailsAction1" />
</message>

新命名空间与您导入的命名空间不匹配。

答案 2 :(得分:0)

刚做了一个快速实验(使用Eclipse WSDL编辑器),当我从外部XSD(与WSDL文件位于同一目录)中选择“使用类型”时,生成了以下代码:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="http://www.example.org/NewWSDLFile/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="NewWSDLFile"
    targetNamespace="http://www.example.org/NewWSDLFile/" xmlns:xsd1="http://www.example.org/NewXMLSchema">
    <wsdl:types>
        (...)
        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <xsd:import namespace="http://www.example.org/NewXMLSchema"
                schemaLocation="NewXMLSchema.xsd">
            </xsd:import>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="NewOperationRequest">
        <wsdl:part name="parameters" type="xsd1:externalSchemaParamType" />
    </wsdl:message>
    (...)

在你的情况下:是“tns”外部XSD的名称空间?