views:

878

answers:

2

I'm trying to use SvcUtil against a wsdl file to generate proxy classes, but I'm getting an element missing error that I think is related to schema group elements. Does anyone know for a fact if svcutil can handle ? And if so will it handle xs:group elements that have ref attributes that point to the group definition that lives in another schema file?

SvcUtil.exe Command (included the paths to the xsd files as well):

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

The error is:

Error: Cannot import wsdl:portType Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.XmlSerializerMessageContractImporter Error: Group InfrastructureRootElements is missing. XPath to Error Source: //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/"&gt;
 <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    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 (reference by 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"&gt;

    <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 from PORT_MT100001UV.xsd (Referenced by RPE.xsd) - notice the "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 (reference by PORT_MT100001UV.xsd) notice the definition of the InfrastructureRootElements group here - this is the same group from the above schema that has the ref attribute:

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

I'm not sure about SvcUtil, but for XSD.exe and WSDL.exe you have to specify all the files that are used by the .xsd file, because they don't recognize elements. Maybe my post will help you, too: http://seanmcilvenna.com/blog/7-general/30-xca-implementation

Sean McIlvenna
yea I'm aware of that issue as I've encountered and overcome it in the past - unfortunately it did not seem to help here. Svcutil.exe is the WCF equivalent of wsdl.exe. Thanks for the blog link - it's always good to find others developing IHE profiles (XDS, XCA, etc.) - maybe I'll see you at connectathon next year?
Tone
+1  A: 

I found this tool - WSCF Blue - from a post on msdn forums. It got me past my errors and also looks to offer quite a bit more in terms of functionality.

Tone