2012-03-07 298 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