我想通过使用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
答案 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文件,指定文件夹并单击“确定”。这些文件可供您随意引用。