SOAP - 必须为元素指定类型属性值

时间:2017-07-10 19:02:19

标签: python xml soap salesforce zeep

使用Python zeep,我与Salesforce的SOAP(特别是元数据)API进行交互。

尝试createMetadata我收到此错误:

Fault: Must specify a {http://www.w3.org/2001/XMLSchema-instance}type attribute value for the {http://soap.sforce.com/2006/04/metadata}metadata element

我已经知道这不是关于传递给方法的参数(createMetadata需要metadata参数的方式,它本身就是一个fullName字段的对象,而是某处缺少xsi:type属性。

这是我的zeep电话:

resp = service['createMetadata'](_soapheaders=soap_headers,
                                 metadata=[{'fullName': 'SomeCustomObject'}])

这是生成的XML:

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
  <soap-env:Body>
    <ns0:createMetadata xmlns:ns0="http://soap.sforce.com/2006/04/metadata">
      <ns0:metadata>
        <ns0:fullName>SomeCustomObject</ns0:fullName>
      </ns0:metadata>
    </ns0:createMetadata>
  </soap-env:Body>
</soap-env:Envelope>

我的问题是:如何使用xsi:typens0:metadata设置为需要设置的zeep家伙??

更新:
我没有使用字典来表示元数据对象,而是将其替换为:

metadata_type = client.get_type('{http://soap.sforce.com/2006/04/metadata}Metadata')
metadata = metadata_type(fullName='SomeCustomObject')
resp = service['createMetadata'](_soapheaders=soap_headers, metadata=[metadata])

新生成的XML是:

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
  <soap-env:Body>
    <ns0:createMetadata xmlns:ns0="http://soap.sforce.com/2006/04/metadata">
      <ns0:metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns0:Metadata">
        <ns0:fullName>SomeCustomObject</ns0:fullName>
      </ns0:metadata>
    </ns0:createMetadata>
  </soap-env:Body>
</soap-env:Envelope>

xsi:type标记上有ns0:metadata属性,但我得到的错误与以前相同。所以我想这不是一个失踪的xsi:type。关于它是什么的任何想法?

2 个答案:

答案 0 :(得分:1)

您可以在此处看到 xsi 元数据中定义。

<metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CustomField">
</metadata>

答案 1 :(得分:1)

答案是xsi:type应该使用'CustomObject'(或其他合适的类型)而不是'Metadata',这是&#34;父母&#34;类型,我相信。这也需要传递的不仅仅是fullName

zeep中,这意味着代替

metadata_type = client.get_type('{http://soap.sforce.com/2006/04/metadata}Metadata')
metadata = metadata_type(fullName='SomeCustomObject')

我用过

custom_object_type = client.get_type('{http://soap.sforce.com/2006/04/metadata}CustomObject')
custom_object = custom_object_type(fullName='SomeCustomObject__c',
                                   label='SomeCustomObject',
                                   pluralLabel='SomeCustomObjects',
                                   nameField={'label': 'name', 'type': 'Text'},
                                   deploymentStatus='Deployed',
                                   sharingModel='ReadWrite')

然后最后:

resp = service['createMetadata'](_soapheaders=soap_headers,
                                 metadata=[custom_object])