将wsdl文件导入xsd文件

时间:2012-03-07 16:44:15

标签: xml soap xsd wsdl

我想通过使用xsd从soap xml生成类。到目前为止我已经成功了,但是现在,我有这个肥皂消息:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" 
    xmlns:tds="http://www.onvif.org/ver10/device/wsdl"> 
    <SOAP-ENV:Body> 
        <tds:GetSystemDateAndTime/> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope>

xsd会生成这个:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Envelope" targetNamespace="http://www.w3.org/2003/05/soap-envelope"
xmlns:mstns="http://www.w3.org/2003/05/soap-envelope"
xmlns="http://www.w3.org/2003/05/soap-envelope"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified"
xmlns:app1="http://www.onvif.org/ver10/device/wsdl">
    <xs:import namespace="http://www.onvif.org/ver10/device/wsdl" schemaLocation="GetSystemDateAndTime_app1.xsd" />
    <xs:element name="Envelope" msdata:IsDataSet="true" msdata:Locale="en-US" msdata:Prefix="SOAP-ENV">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="Body" msdata:Prefix="SOAP-ENV">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element ref="app1:GetSystemDateAndTime" minOccurs="0" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:choice>
        </xs:complexType>
    </xs:element>
</xs:schema>

此xmlns:tds =“http://www.onvif.org/ver10/device/wsdl”是this document上的链接。

正如我所说,到目前为止,我刚刚下载了schemaLocation属性中的文件,将其放到xsd文件和更改路径之类的相同文件夹中。然后我使用了“xsd myXsdFile.xsd otherXsdFiles.xsd / c”。但是使用wsdl文件,这是不可能的。 SchemaLocation属性不带wsdl文件,当然当我使用xsd commnand时,我会收到GetSystemDateAndTime不存在的消息。我知道wsdl文件与xsd非常不同,但是我不能采取正确的方法,如何使用我的xsd文件加入这个文件。有什么建议吗? THX

1 个答案:

答案 0 :(得分:0)

根据我的理解重新解释您的问题,您基本上是在询问如何让生成的XSD文件指向app1:GetSystemDateAndTime元素的真实定义,而不是GetSystemDateAndTime_app1.xsd;问题是app1的定义:GetSystemDateAndTime在&lt; xs:schema /&gt;范围内。 &lt; wsdl:types /&gt;中的元素位于http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl的WSDL文件。

如果您仅将选项限制为生成的XSD和下载的WSDL,则简短的答案是否定的,您不能从WSDL文件中定义的其他XSD获取XSD参考内容。

目前尚不清楚为什么不使用内置的VS工具(服务参考或Web引用(如果您使用的是旧版本))或svcutil.exe来生成客户端代码。从SOAP Envelope XML中反转来自XSD的代码是非常罕见的。尽管如此,SOAP仍然是可能的,如果是XML的话;我以前从未见过......

如果您仍想“加入”,并愿意进行一些手动更改,那么您可以采用两种方式。

漫长的方法是下载所有文件(WSDL + XSD)。在命令提示符下,您可以像这样使用svcutil:

svcutil /t:metadata /directory:d:\temp\11 http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl

输出如下:

Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1]
Copyright (c) Microsoft Corporation.  All rights reserved.

Attempting to download metadata from 'http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl' using WS-Metadata Exchange or DISCO.
Saving downloaded metadata files...
d:\temp\11\www.onvif.org.ver10.schema.xsd
d:\temp\11\www.w3.org.2004.08.xop.include.xsd
d:\temp\11\www.w3.org.XML.1998.namespace.xsd
d:\temp\11\www.onvif.org.ver10.device.wsdl
d:\temp\11\www.w3.org.2005.08.addressing.xsd
d:\temp\11\docs.oasis-open.org.wsrf.bf-2.xsd
d:\temp\11\www.w3.org.2005.05.xmlmime.xsd
d:\temp\11\docs.oasis-open.org.wsn.t-1.xsd
d:\temp\11\docs.oasis-open.org.wsn.b-2.xsd

从WSDL文件中,手动将XSD内容翻录在同一文件夹中的文件devicemgmtwsdl.xsd中;编辑和匹配所有文件中的导入以匹配下载的XSD文件名。引用devicemgmt.wsdl而不是GetSystemDateAndTime_app1.xsd,你就可以了。

或者,使用XSD重构工具,您可以使用简单的Import XML Schema文件向导:将其指向WSDL文件,指定文件夹并单击“确定”。这些文件可供您随意引用。