Ошибки при использовании SvcUtil.exe в wsdl для создания прокси-класса - xs: group - PullRequest
2 голосов
/ 27 октября 2009

Я пытаюсь использовать SvcUtil против файла wsdl для генерации прокси-классов, но я получаю ошибку об отсутствии элемента, которая, как мне кажется, связана с элементами группы схемы. Кто-нибудь знает наверняка, может ли svcutil справиться? И если так, будет ли он обрабатывать элементы xs: group, имеющие атрибуты ref, указывающие на определение группы, которое находится в другом файле схемы?

Команда 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 Ошибка: группа Инфраструктура RootElements отсутствует. XPath to Error Source: // wsdl: определения [@ 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>

structureRoot.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>

Ответы [ 2 ]

4 голосов
/ 23 июня 2010

Я нашел этот инструмент - WSCF Blue - из сообщения на форумах msdn. Это помогло мне справиться с ошибками, а также с точки зрения функциональности.

1 голос
/ 26 февраля 2010

Я не уверен насчет SvcUtil, но для XSD.exe и WSDL.exe необходимо указать все файлы, которые используются в файле .xsd, потому что они не распознают элементы. Возможно мой пост тоже поможет вам: http://seanmcilvenna.com/blog/7-general/30-xca-implementation

...