title: Python SUDS automatically appends xsi:type to complex type
body: <p>I'm trying to call a web service method using python SUDS.</p>
  
  <p>When trying to create a specific complex type SUDS appends <code>xsi:type="ns0:DeedDto"</code> to it.
  Creating other types than this, SUDS does not append the xsi:type.</p>
  
  <p>The problem here is that the recieving end cannot recognize this type and I then get this (specific) error:</p>
  
  <pre><code>WebFault: Server raised fault: 'Unable to cast object of type 'ServiceProxy.DeedDto' to type 'ServiceProxy.DeedDto[]
  </code></pre>
  
  <p>Here is the <a href="http://www.artvise.se/api/v1/mercuryapi/service.svc?wsdl" rel="nofollow noreferrer">WSDL URL</a></p>
  
  <p>Here is the actual code:</p>
  
  <pre><code>def create_case(self, case_data):
      """ CREATECASE """
  
      case_dto = self.client.factory.create('ns0:CaseDto')
  
      coordinates = self.client.factory.create('ns0:Coordinates')
  
      coordinates.Latitude = case_data.get('Latitude', None)
      coordinates.Longitude = case_data.get('Longitude', None)
      coordinates.SystemId = case_data.get('SystemId', None)
  
      case_dto.Coordinates = coordinates
      case_dto.CreatedByID = case_data.get('CreatedByID', None)
      case_dto.CreatedByName = case_data.get('CreatedByName', None)
      case_dto.CreatedDate = case_data.get('CreatedDate', None)
      case_dto.Description = case_data.get('Description', None)
      case_dto.Identifier = case_data.get('Identifier', None)
      case_dto.InboxGuid = case_data.get('InboxGuid', None)
      case_dto.ModifiedByID = case_data.get('ModifiedByID', None)
      case_dto.ModifiedByName = case_data.get('ModifiedByName', None)
      case_dto.ModifiedDate = case_data.get('ModifiedDate', None)
      case_dto.Name = case_data.get('Name', None)
      case_dto.ObjectGuid = case_data.get('ObjectGuid', None)
      case_dto.ObjectID = case_data.get('ObjectID', None)
      case_dto.ObjectTypeGuid = case_data.get('ObjectTypeGuid', None)
      case_dto.RefID = case_data.get('RefID', None)
      case_dto.StatusGuid = case_data.get('StatusGuid', None)
      case_dto.AnswerTypeGuid = case_data.get('AnswerTypeGuid', None)
      case_dto.EventDate = case_data.get('EventDate', None)
      case_dto.HtmlDescription = case_data.get('HtmlDescription', None)
      case_dto.InOutDate = case_data.get('InOutDate', None)
      case_dto.IncomingMediaTypeGuid = case_data.get(
          'IncomingMediaTypeGuid', None)
      case_dto.StartDate = case_data.get('StartDate', None)
      case_dto.StopDate = case_data.get('StopDate', None)
  
      """ COUNTERPART(S) """
  
      counterparts = []
  
      for counterpart in case_data['Counterparts']:
          counterpart_Dto = self.client.factory.create(
              'ns0:CounterpartDto')
          counterpart_Dto.Address1 = counterpart.get('Address1', None)
          counterpart_Dto.Address2 = counterpart.get('Address2', None)
          counterpart_Dto.Address3 = counterpart.get('Address3', None)
          counterpart_Dto.City = counterpart.get('City', None)
          counterpart_Dto.CompanyName = counterpart.get('CompanyName', None)
          counterpart_Dto.Country = counterpart.get('Country', None)
          counterpart_Dto.EMail = counterpart.get('EMail', None)
          counterpart_Dto.EMail2 = counterpart.get('EMail2', None)
          counterpart_Dto.FirstName = counterpart.get('FirstName', None)
          counterpart_Dto.HomePhone = counterpart.get('HomePhone', None)
          counterpart_Dto.LastName = counterpart.get('LastName', None)
          counterpart_Dto.MobilePhone = counterpart.get('MobilePhone', None)
          counterpart_Dto.OrganisationNumber = counterpart.get(
              'OrganisationNumber', None)
          counterpart_Dto.RealEstateArea = counterpart.get(
              'RealEstateArea', None)
          counterpart_Dto.RealEstateBlock = counterpart.get(
              'RealEstateBlock', None)
          counterpart_Dto.RealEstateUnit = counterpart.get(
              'RealEstateUnit', None)
          counterpart_Dto.SocialSecurityNumber = counterpart.get(
              'SocialSecurityNumber', None)
          counterpart_Dto.WorkPhone = counterpart.get('WorkPhone', None)
          counterpart_Dto.Zip = counterpart.get('Zip', None)
          counterparts.append(counterpart_Dto)
  
      case_dto.Counterparts = counterparts
  
      """ DEED(S) """
  
      deeds = []
  
      for deed in case_data['Deeds']:
          deed_Dto = self.client.factory.create('ns0:DeedDto')
  
          coordinates = self.client.factory.create('ns0:Coordinates')
          coordinates.Latitude = deed.get('Latitude', None)
          coordinates.Longitude = deed.get('Longitude', None)
          coordinates.SystemId = deed.get('SystemId', None)
          deed_Dto.Coordinates = coordinates
  
          deed_Dto.CreatedByID = deed.get('CreatedByID', None)
          deed_Dto.CreatedByName = deed.get('CreatedByName', None)
          deed_Dto.CreatedDate = deed.get('CreatedDate', None)
          deed_Dto.Description = deed.get('Description', None)
          deed_Dto.Identifier = deed.get('Identifier', None)
          deed_Dto.InboxGuid = deed.get('InboxGuid', None)
          deed_Dto.ModifiedByID = deed.get('ModifiedByID', None)
          deed_Dto.ModifiedByName = deed.get('ModifiedByName', None)
          deed_Dto.ModifiedDate = deed.get('ModifiedDate', None)
          deed_Dto.Name = deed.get('Name', None)
          deed_Dto.ObjectGuid = deed.get('ObjectGuid', None)
          deed_Dto.ObjectID = deed.get('ObjectID', None)
          deed_Dto.ObjectTypeGuid = deed.get('ObjectTypeGuid', None)
          deed_Dto.RefID = deed.get('RefID', None)
          deed_Dto.StatusGuid = deed.get('StatusGuid', None)
          deed_Dto.CaseObjectID = deed.get('CaseObjectID', None)
          deed_Dto.HtmlContent = deed.get('HtmlContent', None)
          deed_Dto.TextContent = deed.get('TextContent', None)
  
          """ FILE(S) """
  
          files = []
  
          for file_ in case_data['Files']:
              file_Dto = self.client.factory.create('ns0:FileDto')
              file_Dto.Data = file_.get('Data', None)
              file_Dto.Extension = file_.get('Extension', None)
              file_Dto.FileID = file_.get('FileID', None)
              file_Dto.FileName = file_.get('FileName', None)
              file_Dto.Size = file_.get('Size', None)
              files.append(file_Dto)
  
          deed_Dto.Files = files
          deeds.append(deed_Dto)
  
      case_dto.Deeds = deeds
  
      self.validate_request(case_dto, 'create_case')
  
      response = self.client.service.CreateCase(
          self.api_key, case_dto)
      return response
  </code></pre>
  
  <p>Looking at the actual service:</p>
  
  <pre><code>    Service ( Service ) tns="http://tempuri.org/"
     Prefixes (3)
        ns0 = "http://schemas.datacontract.org/2004/07/Artvise.Mercury.Base.DataContracts.API"
        ns1 = "http://schemas.microsoft.com/2003/10/Serialization/"
        ns2 = "http://www.artvise.se/MercuryAPI/"
     Ports (1):
        (BasicHttpBinding_IService)
           Methods (21):
              CreateCase(xs:string apiKey, ns0:CaseDto caseDto, )
              CreateDeed(xs:string apiKey, ns0:DeedDto deedDto, )
              GetAnswerTypes(xs:string apiKey, )
              GetCase(xs:string apiKey, xs:int objectID, )
              GetCaseByIdentifier(xs:string apiKey, xs:string identifier, )
              GetCaseByRefID(xs:string apiKey, xs:string refID, )
              GetCasesByCounterpartSocialSecurityNumber(xs:string apiKey, xs:string socialSecurityNumber, xs:boolean includeDeeds, )
              GetCasesByInboxGuid(xs:string apiKey, ns1:guid inboxGuid, xs:boolean includeDeeds, )
              GetDeed(xs:string apiKey, xs:int objectID, )
              GetDeedByRefID(xs:string apiKey, xs:string refID, )
              GetDeedTypes(xs:string apiKey, )
              GetFile(xs:string apiKey, xs:int fileID, )
              GetFileByRefID(xs:string apiKey, xs:string refID, )
              GetInboxes(xs:string apiKey, )
              GetMediaTypes(xs:string apiKey, )
              GetStatuses(xs:string apiKey, )
              GetSystemMessages(xs:string apiKey, )
              SetCaseCoordinates(xs:string apiKey, xs:int objectID, ns0:CoordinatesDto coordinates, )
              SetCaseReference(xs:string apiKey, xs:int objectID, xs:string refID, )
              SetCaseStatus(xs:string apiKey, xs:int objectID, ns1:guid statusGuid, )
              Test()
           Types (27):
              ns0:AnswerTypeDto
              ns0:ArrayOfAnswerTypeDto
              ns0:ArrayOfCaseDto
              ns0:ArrayOfCounterpartDto
              ns0:ArrayOfDeedDto
              ns0:ArrayOfDeedTypeDto
              ns0:ArrayOfFileDto
              ns0:ArrayOfInboxDto
              ns0:ArrayOfMediaTypeDto
              ns0:ArrayOfStatusDto
              ns0:ArrayOfSystemMessageDto
              ns0:CaseDto
              ns0:CoordinatesDto
              ns0:CounterpartDto
              ns0:CreateObjectResult
              ns0:DeedDto
              ns0:DeedTypeDto
              ns0:FileDto
              ns0:InboxDto
              ns0:MediaTypeDto
              ns0:ObjectDto
              ns0:OperationResult
              ns0:StatusDto
              ns0:SystemMessageDto
              ns1:char
              ns1:duration
              ns1:guid
  </code></pre>
  
  <p>Seeing as this is an already built solution to which I'm only adding, I need to stick to SUDS.
  Otherwise I would maybe look at something else.</p>