Errori nell'utilizzo di SvcUtil.exe su un wsdl per generare la classe proxy - xs: element group
-
06-07-2019 - |
Domanda
Sto cercando di usare SvcUtil contro un file wsdl per generare classi proxy, ma sto ricevendo un errore mancante di un elemento che penso sia correlato agli elementi del gruppo di schemi. Qualcuno sa per certo se svcutil può gestire? E in tal caso gestirà xs: elementi di gruppo con attributi ref che puntano alla definizione di gruppo che risiede in un altro file di schema?
Comando SvcUtil.exe (inclusi anche i percorsi dei file 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
L'errore è:
Errore: impossibile importare wsdl: portType Dettaglio: è stata generata un'eccezione mentre in esecuzione un'estensione di importazione WSDL: System.ServiceModel.Description.XmlSerializerMessageContractImporter Errore: gruppo InfrastructureRootElements mancante. XPath alla fonte di errore: // wsdl: definizioni [@ targetNamespace = 'urna: 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 (riferimento di 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>
Snippet da PORT_MT100001UV.xsd (referenziato da RPE.xsd) - nota il messaggio " InfrastructureRootElements " xs: gruppo:
<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 (riferimento di PORT_MT100001UV.xsd) nota qui la definizione del gruppo InfrastructureRootElements - questo è lo stesso gruppo dello schema sopra che ha l'attributo 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>
Soluzione
Ho trovato questo strumento - WSCF Blue - da un post sui forum msdn. Mi ha superato i miei errori e sembra anche offrire un po 'di più in termini di funzionalità.
Altri suggerimenti
Non sono sicuro di SvcUtil, ma per XSD.exe e WSDL.exe è necessario specificare tutti i file utilizzati dal file .xsd, perché non riconoscono gli elementi. Forse anche il mio post ti aiuterà: http://seanmcilvenna.com/blog / 7-general / 30-xca-implementazione