【发布时间】:2010-12-10 14:54:00
【问题描述】:
我正在尝试针对 wsdl 文件使用 SvcUtil 来生成代理类,但我遇到了一个元素丢失错误,我认为该错误与架构组元素有关。有谁知道 svcutil 是否可以处理的事实?如果是这样,它是否会处理具有指向另一个模式文件中的组定义的 ref 属性的 xs:group 元素?
SvcUtil.exe 命令(也包括 xsd 文件的路径):
d:\codegen\svcutil.exe d:\codegen\RPE\ProtocolStateManager.wsdl d:\codegen\RPE\schema\RPE.xsd d:\codegen\RPE\schema\PORT_MT100001UV.xsd d:\codegen\RPE\schema\coreschemas\infrastructureRoot.xsd d:\codegen\RPE\schema\coreschemas\dataTypes.xsd d:\codegen\RPE\schema\coreschemas\voc.xsd /l:cs
错误是:
错误:无法导入 wsdl:portType 详细信息:在 运行 WSDL 导入扩展: System.ServiceModel.Description.XmlSerializerMessageContractImporter 错误:组 InfrastructureRootElements 丢失。 错误源的 XPath: //wsdl:definitions[@targetNamespace='urn:ihe:qrph:rpe:2009']/wsdl:portType[@name='ProtocolStateManager']
ProtocolStateManager.wsdl:
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="ProtocolStateManager"
targetNamespace="urn:ihe:qrph:rpe:2009"
xmlns:rpe="urn:ihe:qrph:rpe:2009"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/">
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TYPE DEFINITION - List of services participating in this BPEL process
The default output of the BPEL designer uses strings as input and
output to the BPEL Process. But you can define or import any XML
Schema type and use them as part of the message types.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:ihe:qrph:rpe:2009">
<include schemaLocation="schema\RPE.xsd"/>
</schema>
</types>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MESSAGE TYPE DEFINITION - Definition of the message types used as
part of the port type defintions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<message name="EnterPatientRequestRequestMessage">
<part name="payload" element="rpe:EnterPatientRequest"/>
</message>
<message name="EnterPatientRequestResponseMessage">
<part name="payload" element="rpe:EnterPatientRequest"/>
</message>
<message name="PatientScreeningVisitsScheduledRequestMessage">
<part name="payload" element="rpe:PatientScreeningVisitsScheduled"/>
</message>
<message name="PatientScreeningVisitsScheduledResponseMessage">
<part name="payload" element="rpe:PatientScreeningVisitsScheduled"/>
</message>
<message name="PatientScreeningVisitRecordedRequestMessage">
<part name="payload" element="rpe:PatientScreeningVisitRecorded"/>
</message>
<message name="PatientScreeningVisitRecordedResponseMessage">
<part name="payload" element="rpe:PatientScreeningVisitRecorded"/>
</message>
<message name="EnrollPatientRequestRequestMessage">
<part name="payload" element="rpe:EnrollPatientRequest"/>
</message>
<message name="EnrollPatientRequestResponseMessage">
<part name="payload" element="rpe:EnrollPatientRequest"/>
</message>
<message name="PatientStudyVisitsScheduledRequestMessage">
<part name="payload" element="rpe:PatientStudyVisitsScheduled"/>
</message>
<message name="PatientStudyVisitsScheduledResponseMessage">
<part name="payload" element="rpe:PatientStudyVisitsScheduled"/>
</message>
<message name="PatientStudyVisitRecordedRequestMessage">
<part name="payload" element="rpe:PatientStudyVisitRecorded"/>
</message>
<message name="PatientStudyVisitRecordedResponseMessage">
<part name="payload" element="rpe:PatientStudyVisitRecorded"/>
</message>
<message name="AlertProtocolStateMessage">
<part name="payload" element="rpe:AlertProtocolState"/>
</message>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PORT TYPE DEFINITION - A port type groups a set of operations into
a logical service unit.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- portType implemented by the ProtocolStateManager BPEL process -->
<portType name="ProtocolStateManager">
<operation name="EnterPatientRequest">
<input message="rpe:EnterPatientRequestRequestMessage"/>
<output message="rpe:EnterPatientRequestResponseMessage"/>
</operation>
<operation name="PatientScreeningVisitsScheduled">
<input message="rpe:PatientScreeningVisitsScheduledRequestMessage"/>
<output message="rpe:PatientScreeningVisitsScheduledResponseMessage"/>
</operation>
<operation name="RecordPatientScreeningVisit">
<input message="rpe:PatientScreeningVisitRecordedRequestMessage"/>
<output message="rpe:PatientScreeningVisitRecordedResponseMessage"/>
</operation>
<operation name="EnrollPatientRequest">
<input message="rpe:EnrollPatientRequestRequestMessage"/>
<output message="rpe:EnrollPatientRequestResponseMessage"/>
</operation>
<operation name="PatientStudyVisitsScheduled">
<input message="rpe:PatientStudyVisitsScheduledRequestMessage"/>
<output message="rpe:PatientStudyVisitsScheduledResponseMessage"/>
</operation>
<operation name="RecordPatientStudyVisit">
<input message="rpe:PatientStudyVisitRecordedRequestMessage"/>
<output message="rpe:PatientStudyVisitRecordedResponseMessage"/>
</operation>
</portType>
<portType name="ProtocolStateManagerCallback">
<operation name="onAlertProtocolState">
<input message="rpe:AlertProtocolStateMessage"/>
</operation>
</portType>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PARTNER LINK TYPE DEFINITION
the ProtocolStateManager partnerLinkType binds the provider and
requester portType into an asynchronous conversation.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<plnk:partnerLinkType name="ProtocolStateManager">
<plnk:role name="ProtocolStateManagerProvider">
<plnk:portType name="rpe:ProtocolStateManager"/>
</plnk:role>
<plnk:role name="ProtocolStateManagerCallbackListener">
<plnk:portType name="rpe:ProtocolStateManagerCallback"/>
</plnk:role>
</plnk:partnerLinkType>
</definitions>
RPE.xsd(ProtocolStateManager.wsdl 引用):
<schema attributeFormDefault="unqualified" elementFormDefault="qualified"
targetNamespace="urn:ihe:qrph:rpe:2009"
xmlns:rpe="urn:ihe:qrph:rpe:2009"
xmlns:v3="urn:hl7-org:v3"
xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="urn:hl7-org:v3" schemaLocation="PORT_MT100001UV.xsd"/>
<element name="RetrieveProtocolDef" type="rpe:RetrieveProtocolDefType"/>
<element name="EnterPatientRequest" type="rpe:EnterPatientRequestType"/>
<element name="EnrollPatientRequest" type="rpe:EnrollPatientRequestType"/>
<element name="PatientScreeningVisitsScheduled" type="rpe:PatientScreeningVisitsScheduledType"/>
<element name="PatientScreeningVisitRecorded" type="rpe:PatientScreeningVisitRecordedType"/>
<element name="PatientStudyVisitsScheduled" type="rpe:PatientStudyVisitsScheduledType"/>
<element name="PatientStudyVisitRecorded" type="rpe:PatientStudyVisitRecordedType"/>
<element name="AmendProtocolDef" type="rpe:AmendProtocolDefType"/>
<element name="AlertProtocolState" type="rpe:AlertProtocolStateType"/>
<!-- need patient information and study information
EnterPatientRequestType can also be used for the return of candidateID?-->
<complexType name="RetrieveProtocolDefType">
<sequence>
<element name="query" type="string"/>
<element name="protocolDef" type="string"/>
</sequence>
</complexType>
<complexType name="EnterPatientRequestType">
<sequence>
<element name="patient" type="rpe:PatientType"/>
<element name="study" type="v3:PORT_MT100001UV.Study"/>
</sequence>
</complexType>
<!-- need patient for candidateID of the patient being scheduled for screening visits
need studyID to associate the candidate with the study
need schedule information-->
<complexType name="PatientScreeningVisitsScheduledType">
<sequence>
<element name="patient" type="rpe:PatientType"/>
<element name="studyID" type="v3:II"/>
<element name="schedule" type="rpe:ScreeningVisitScheduleType"/>
</sequence>
</complexType>
<!-- need patient for candidateID of patient being recorded for screening visit
need studyID to associate the candidate with the study
need visit information for the screening visit being recorded-->
<complexType name="PatientScreeningVisitRecordedType">
<sequence>
<element name="patient" type="rpe:PatientType"/>
<element name="studyID" type="v3:II"/>
<element name="visit" type="rpe:ScreenVisitType"/>
</sequence>
</complexType>
<!-- need patient information and study information
EnterPatientRequestType can also be used for the return of subjectID?-->
<complexType name="EnrollPatientRequestType">
<sequence>
<element name="patient" type="rpe:PatientType"/>
<element name="study" type="v3:PORT_MT100001UV.Study"/>
</sequence>
</complexType>
<!-- need patient for subjectID of the patient being scheduled for visits
need studyID to associate the subject with the study
need schedule information-->
<complexType name="PatientStudyVisitsScheduledType">
<sequence>
<element name="patient" type="rpe:PatientType"/>
<element name="studyID" type="v3:II"/>
<element name="schedule" type="rpe:StudyVisitScheduleType"/>
</sequence>
</complexType>
<!-- need patient for subjectID of patient being recorded for visit
need studyID to associate the subject with the study
need visit information for the visit being recorded-->
<complexType name="PatientStudyVisitRecordedType">
<sequence>
<element name="patient" type="rpe:PatientType"/>
<element name="studyID" type="v3:II"/>
<element name="visit" type="rpe:StudyVisitType"/>
</sequence>
</complexType>
<!-- patient information should NOT include emrID?
should contain placeholder for candidateID and subjectID
what specific demographics data is needed?
Should this be a generic type so that an XML standard can be passed?-->
<complexType name="PatientType">
<sequence>
<element name="candidateID" type="string"/>
<element name="subjectID" type="string"/>
<element name="name" type="string"/>
<element name="address" type="string"/>
<element name="dob" type="string"/>
</sequence>
</complexType>
<!-- studyID to identify the study
should studyData be a generic type to store an XML standard
<complexType name="StudyType">
<sequence>
<element name="studyID" type="string"/>
<element name="studyData" type="string"/>
</sequence>
</complexType>-->
<complexType name="ScreenVisitType">
<sequence>
<element name="visitID" type="string"/>
<element name="candidateID" type="string"/>
<element name="date" type="string"/>
<element name="screenVisitData" type="string"/>
</sequence>
</complexType>
<complexType name="StudyVisitType">
<sequence>
<element name="visitID" type="string"/>
<element name="subjectID" type="string"/>
<element name="date" type="string"/>
<element name="studyVisitData" type="string"/>
</sequence>
</complexType>
<complexType name="ScreeningVisitScheduleType">
<sequence>
<element name="visit" type="rpe:ScreenVisitType" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="StudyVisitScheduleType">
<sequence>
<element name="visit" type="rpe:StudyVisitType" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="AmendProtocolDefType">
<sequence>
<element name="protocolDef" type="string"/>
</sequence>
</complexType>
<complexType name="AlertProtocolStateType">
<sequence>
<element name="patient" type="rpe:PatientType"/>
<element name="study" type="v3:PORT_MT100001UV.Study"/>
</sequence>
</complexType>
</schema>
来自 PORT_MT100001UV.xsd 的片段(由 RPE.xsd 引用) - 注意“InfrastructureRootElements”xs:group:
<xs:complexType name="PORT_MT100001UV.Access">
<xs:sequence>
<xs:group ref="InfrastructureRootElements"/>
<xs:element name="id" type="II" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="targetSiteCode" type="CD" minOccurs="0" maxOccurs="1"/>
<xs:choice>
<xs:choice>
<xs:element name="accessedPerson" type="PORT_MT100001UV.Person" nillable="true"
minOccurs="0"
maxOccurs="1"/>
<xs:element name="accessedNonPersonLivingSubject"
type="PORT_MT100001UV.NonPersonLivingSubject"
nillable="true"
minOccurs="0"
maxOccurs="1"/>
</xs:choice>
<xs:element name="accessedProduct" type="PORT_MT100001UV.Product" nillable="true"
minOccurs="0"
maxOccurs="1"/>
</xs:choice>
</xs:sequence>
<xs:attributeGroup ref="InfrastructureRootAttributes"/>
<xs:attribute name="nullFlavor" type="NullFlavor" use="optional"/>
<xs:attribute name="classCode" type="RoleClassAccess" use="required"/>
</xs:complexType>
infrastructureRoot.xsd(由 PORT_MT100001UV.xsd 引用)请注意此处的 InfrastructureRootElements 组的定义 - 这是上述架构中具有 ref 属性的同一组:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:mif="urn:hl7-org:v3/mif" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:v3="urn:hl7-org:v3"
xmlns:ex="urn:hl7-org/v3-example"
elementFormDefault="qualified">
<xs:annotation xmlns="urn:hl7-org:v3">
<xs:documentation>Source Information...</xs:documentation>
</xs:annotation>
<xs:include schemaLocation="voc.xsd"/>
<xs:include schemaLocation="datatypes.xsd"/>
<xs:group name="InfrastructureRootElements">
<xs:sequence>
<xs:element name="realmCode" type="CS" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="typeId" type="II" minOccurs="0" maxOccurs="1"/>
<xs:element name="templateId" type="II" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:group>
<xs:attributeGroup name="InfrastructureRootAttributes"/>
</xs:schema>
【问题讨论】:
-
我确定您只需要提供所有架构文件。你有这个工作吗?
-
不幸的是,我现在的注意力已经转移到其他事情上了。最后我正在研究这个我正在检查所有架构引用 - 我认为那里有 30 多个 xsd 文件都有疯狂的名字.. ug - 如果以及当我回到它时,我会发布解决方案。
标签: xsd wsdl wcf-client svcutil.exe