2012-03-07 188 views
0

我想通过使用xsd从soap xml生成类。我已经成功至今,但现在,我有这个SOAP消息:将wsdl文件导入到xsd文件

<?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

回答

0

要按照我的理解重新修改您的问题,您基本上都在问如何让生成的XSD文件指向app1:GetSystemDateAndTime元素的实际定义,而不是GetSystemDateAndTime_app1.xsd;问题在于app1的定义:GetSystemDateAndTime位于位于http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl的WSDL文件的< wsdl:types />中的< xs:schema />元素中。

如果您仅将选项限制为您生成的XSD和下载的WSDL,则简短答案为否,您不能在WSDL文件中定义另一个XSD中的XSD参考内容。

不清楚为什么你不使用内置的VS工具(Service Reference或Web Reference如果你使用的是旧版本)或svcutil.exe来生成你的客户端代码。绑定来自SOAP信封XML反转的XSD的代码是非常不寻常的。尽管如此,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重构工具,您可以使用简单的导入XML模式文件向导:将它指向WSDL文件,指定一个文件夹并单击确定。这些文件将在那里供您参考,只要你喜欢。

+0

Thx,用于回复。这是我的错误。我不得不写这个:“xsd GetSystemDateAndTime.xsd GetSystemDateAndTime_app1.xsd/c”。我不知道,我发现我必须将schemaLocation属性更改为生成类。我愚蠢的错误。 – Hyen 2012-03-09 13:01:31