4

I have a WSDL that I'm trying to generate into Apex Classes for a Web Service, but I get the following error:

Unsupported Schema element found http://www.w3.org/2001/XMLSchema:attribute

I have a xs:schema element as follows (the xs:attributes are on the bottom):

<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="anyType" nillable="true" type="xs:anyType"/>
    <xs:element name="anyURI" nillable="true" type="xs:anyURI"/>
    <xs:element name="base64Binary" nillable="true" type="xs:base64Binary"/>
    <xs:element name="boolean" nillable="true" type="xs:boolean"/>
    <xs:element name="byte" nillable="true" type="xs:byte"/>
    <xs:element name="dateTime" nillable="true" type="xs:dateTime"/>
    <xs:element name="decimal" nillable="true" type="xs:decimal"/>
    <xs:element name="double" nillable="true" type="xs:double"/>
    <xs:element name="float" nillable="true" type="xs:float"/>
    <xs:element name="int" nillable="true" type="xs:int"/>
    <xs:element name="long" nillable="true" type="xs:long"/>
    <xs:element name="QName" nillable="true" type="xs:QName"/>
    <xs:element name="short" nillable="true" type="xs:short"/>
    <xs:element name="string" nillable="true" type="xs:string"/>
    <xs:element name="unsignedByte" nillable="true" type="xs:unsignedByte"/>
    <xs:element name="unsignedInt" nillable="true" type="xs:unsignedInt"/>
    <xs:element name="unsignedLong" nillable="true" type="xs:unsignedLong"/>
    <xs:element name="unsignedShort" nillable="true" type="xs:unsignedShort"/>
    <xs:element name="char" nillable="true" type="tns:char"/>
    <xs:simpleType name="char">
        <xs:restriction base="xs:int"/>
    </xs:simpleType>
    <xs:element name="duration" nillable="true" type="tns:duration"/>
    <xs:simpleType name="duration">
        <xs:restriction base="xs:duration">
            <xs:pattern value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?"/>
            <xs:minInclusive value="-P10675199DT2H48M5.4775808S"/>
            <xs:maxInclusive value="P10675199DT2H48M5.4775807S"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="guid" nillable="true" type="tns:guid"/>
    <xs:simpleType name="guid">
        <xs:restriction base="xs:string">
            <xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:attribute name="FactoryType" type="xs:QName"/>
    <xs:attribute name="Id" type="xs:ID"/>
    <xs:attribute name="Ref" type="xs:IDREF"/>
</xs:schema>
4

In this particular case you are dealing with the common wsdl:import that .NET adds to web services to handle generic serialization (schemas.microsoft.com.2003.10.Serialization.xsd Schema).

Being generic to all web services, it most likely contains a number of elements that you don't use in the base WSDL.

The problem elements in question are:

<xs:attribute name="FactoryType" type="xs:QName"/>
<xs:attribute name="Id" type="xs:ID"/>
<xs:attribute name="Ref" type="xs:IDREF"/>

If you aren't actually using any of these, you can safely comment them out. I've rarely, if ever, seen these three attributes used in the wild.

Also note that the documentation claims there is support for xsd:attribute - your mileage may vary.

Apex also supports the following schema constructs:

  • xsd:attribute, in Apex code saved using API version 15.0 and later

I've built an alternative version of Wsdl2Apex that takes into account xsd:attribute support and is well tuned to .NET generated WSDLs. You can see the details in the question Creating a class by consuming a WSDL document Schema:attribute.

  • much easier than the solution I found – Scott Pelak Nov 21 '15 at 20:23
5

Salesforce's Wsdl2Apex doesn't support the xs:attribute element. In this post, @Sonam_SFDC describes how to fix the issue:

Here, I understand that the schema contain definition of attribute that is not part of any object/element.

In a normal document layout schema, this would permitted in this form for the purposes of defining reusable element attributes (via ref).

As it is defined as attribute, the conversion to Apex attempts to assign this attribute to an object, but as it is not part of an object/class/element, it cannot be defined.

You can use one of two options:

1) Declare the attribute implicitly within the elements that require them. Then remove the xs:attribute "name" from the schema level.

2) Define the attribute as data type (xs:simpleType). If the attribute (described in #1) was intended to be defined a data type, change its declaration to "xs:simplyType", and include a "xsd:restriction" item that uses the "type" property of the original "xs:attribute" definition.

Following Option 2, changing

<xs:attribute name="FactoryType" type="xs:QName"/>
<xs:attribute name="Id" type="xs:ID"/>
<xs:attribute name="Ref" type="xs:IDREF"/>

to

<xs:simpleType name="FactoryType">
    <xsd:restriction type="xs:QName"/>
</xs:simpleType>
<xs:simpleType name="Id">
    <xs:restriction type="xs:ID"/>
</xs:simpleType>
<xs:simpleType name="Ref">
    <xsd:restriction type="xs:IDREF"/>
</xs:simpleType>

solves the issue.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.