Mapping List Complex Types in BPM (unbounded)

Hello,
  I need help in how can I map a list of complex types in BPM.
  I have a list of products that brings a web service that I have to map to the process context. Both types have the same elements, but the process context BPM shows me an error because it is different of the web service.
  Please, any documentation or advice.
Regards
SU

Hi,
For mapping the complex types, you need to follow the below:
Start by mapping the outermost node first and then mapping the attributes inside the node. Intially it will show the (types do not match) error and when you are done with all the mapping the error would vanish.
Cheers,
Arafat

Similar Messages

  • How to map XSD complex type nodes

    Hello In my XSD I have complex type like this:
    How to map this node to Target filed, I can not see PostalCode node my graphical editor:
    <xs:element name="InternationalAddress" nillable="true" type="tns:InternationalAddress" />
      <xs:complexType name="CanadianAddress">
        <xs:complexContent mixed="false">
          <xs:extension base="tns:Address">
            <xs:sequence>
              <xs:element minOccurs="0" name="PostalCode" nillable="true" type="xs:string">
              </xs:element>
              <xs:element minOccurs="0" name="Province" nillable="true" type="tns:ProvinceCodes" />
            </xs:sequence>
          </xs:extension>
        </xs:complexContent>
      </xs:complexType>

    How to handle this in my graphical mapping:
    <xs:complexType name="Address">
        <xs:complexContent mixed="false">
          <xs:extension base="tns:BusinessObject">
            <xs:sequence>
              <xs:element minOccurs="0" name="City" nillable="true" type="xs:string">
              </xs:element>
              <xs:element minOccurs="0" name="Country" nillable="true" type="xs:string">
              </xs:element>
              <xs:element minOccurs="0" name="Line1" nillable="true" type="xs:string">
              </xs:element>
              <xs:element minOccurs="0" name="Line2" nillable="true" type="xs:string">
              </xs:element>
              <xs:element minOccurs="0" name="Line3" nillable="true" type="xs:string">
              </xs:element>
              <xs:element minOccurs="0" name="Line4" nillable="true" type="xs:string">
              </xs:element>
            </xs:sequence>
          </xs:extension>
        </xs:complexContent>
      </xs:complexType>
      <xs:element name="Address" nillable="true" type="tns:Address" />
      <xs:complexType name="InternationalAddress">
        <xs:complexContent mixed="false">
          <xs:extension base="tns:Address">
            <xs:sequence>
              <xs:element minOccurs="0" name="Region" nillable="true" type="xs:string">
              </xs:element>
              <xs:element minOccurs="0" name="PostalCode" nillable="true" type="xs:string">
              </xs:element>
            </xs:sequence>
          </xs:extension>
        </xs:complexContent>
      </xs:complexType>
      <xs:element name="InternationalAddress" nillable="true" type="tns:InternationalAddress" />
      <xs:complexType name="CanadianAddress">
        <xs:complexContent mixed="false">
          <xs:extension base="tns:Address">
            <xs:sequence>
              <xs:element minOccurs="0" name="PostalCode" nillable="true" type="xs:string">
              </xs:element>
              <xs:element minOccurs="0" name="Province" nillable="true" type="tns:ProvinceCodes" />
            </xs:sequence>
          </xs:extension>
        </xs:complexContent>
      </xs:complexType>
      <xs:element name="CanadianAddress" nillable="true" type="tns:CanadianAddress" />
      <xs:complexType name="AmericanAddress">
        <xs:complexContent mixed="false">
          <xs:extension base="tns:Address">
            <xs:sequence>
              <xs:element minOccurs="0" name="State" nillable="true" type="tns:StateCodes">
              </xs:element>
              <xs:element minOccurs="0" name="ZipCode" nillable="true" type="xs:string">
              </xs:element>
            </xs:sequence>
          </xs:extension>
        </xs:complexContent>
      </xs:complexType>
      <xs:element name="AmericanAddress" nillable="true" type="tns:AmericanAddress" />

  • Map xsd complex type to existing java class without adding JAXB annotations

    Hello
    I've got a case where I should map an xsd complex type to an existing Java class without modifying that class, i.e. without adding JAXB annotations to that class.
    Is this possible somehow?
    As far as I've understood, the <javaType> declaration (adapter, parse/print methods) can only be used for xsd simple types.
    Thanks, Tom

    It should be possible to implement an XmlAdapter<...,...> which performs the required conversion between the original type and a JAXB-annotated type. Then, at the places where the original type is used, the @XmlJavaTypeAdapter annotation would be used.
    The xjc compiler supports this for xsd simple types (xjc:javaType annotation), but not for complex types.
    Any idea why this is restricted to simple types?
    Would it be possible to implement a xjc plugin which does this for complex types?
    Thanks Tom.

  • Using a complex type as my input parameter

    I have defined a complex type that I want to use as my input parameter for one of my operations. I create the operation and add the complex type to my signature. When I go to the 'Query Map' dialog and try and map the complex type to one of my physical data sources the physical data source is deleted from the picutre.
    Here is what my complex type looks like:
    <xs:complexType name="FinancialContractRequestType">
    <xs:complexContent>
    <xs:extension base="srvcfwork:BaseRequestType">
         <xs:sequence>
         <xs:element name="ContractId" type="nylbt:TextType"/>
         <xs:element name="ContractIssueCd" type="nylbt:TextType" minOccurs="0"/>
         </xs:sequence>
    </xs:extension>
    </xs:complexContent>
    </xs:complexType>

    When I cut and pasted the xml I didn't put that part in but I do have it. Here is what my whole schema looks like:
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:srvcfwork="http://newyorklife.com/schemas/framework" xmlns:nylbt="http://newyorklife.com/schemas/cim/common/nylcorebusinesstypes" xmlns:tns="http://newyorklife.com/services/data/financialcontract" targetNamespace="http://newyorklife.com/services/data/financialcontract" elementFormDefault="qualified" version="0.1">
    <xs:import namespace="http://newyorklife.com/schemas/cim/common/nylcorebusinesstypes"
    schemaLocation="../../../schemas/cim/common/NYLCoreBusinessTypes_0_1.xsd"/>
    <xs:import namespace="http://newyorklife.com/schemas/framework"
    schemaLocation="../../../schemas/framework/ServiceFramework_0_1.xsd"/>
    <xs:element name="FinancialContractRequest" type="tns:FinancialContractRequestType"></xs:element>
    <xs:complexType name="FinancialContractRequestType">
    <xs:complexContent>
    <xs:extension base="srvcfwork:BaseRequestType">
         <xs:sequence>
         <xs:element name="ContractId" type="nylbt:TextType"/>
         <xs:element name="ContractIssueCd" type="nylbt:TextType" minOccurs="0"/>
         </xs:sequence>
    </xs:extension>
    </xs:complexContent>
    </xs:complexType>
    </xs:schema>

  • How to generate wsdl for complex type using wscompile?

    Hi
    Since couple of days I am trying to generate the the wsdl for following classes
    abstract class Key implements serializable{
    class sikeKey extends Key{
    int siteKey;
    class AddressKey extends siteKey{
    int addressId;
    class Model{
    AddressKey key = new AddressKey();
    }I am using following ant script for wscompile
          <wscompile
              fork= "true"
              base="${dest.dir}/war/WEB-INF/classes"
              server="true"   
              features="wsi"
              mapping="${dest.dir}/war/WEB-INF/Address_Mapping.xml"
              sourceBase="${war.dir}/WEB-INF/classes"
              optimize="false"
              debug="true"
              keep="false"
              verbose="true"
              xPrintStackTrace="true"
              config="${acws-config-dir}/Address_Config.xml">
              <classpath>
                            <pathelement path="${acws.classpath}"/>
                            <pathelement path="${war.dir}/WEB-INF/classes"/>
                   </classpath>
          </wscompile>
    <taskdef name="wscompile" classname="com.sun.xml.rpc.tools.ant.Wscompile">
        <classpath path="${acws.classpath}"/>
    </taskdef>It generates the wsdl but without all complex type.
    <complexType name="AddressWebServiceModel">
    <sequence>
    <element name="addKey" type="tns:AddressKey" nillable="true"/>
    </sequence>
    </complexType>
    <complexType name="AddressKey">
    <sequence>
    <element name="siteID" type="string" nillable="true"/>
    <element name="addressID" type="int"/>
    </sequence>
    </complexType>Here it should create the right mapping for classes siteKey so that the webservice call can be mapped with the response of this Model.
    Any one know how to configure the above script for proper mapping of complex type?

    Add the concrete subclasses of Key in an <AddtionalType> element in your config.xm. file.

  • Xsd:list using complex type ??

    Hello,
    I have modified world.xsd from (www.manojc.com... sample8)
    My customer wants to return a list of complex types. In this case list of Country (CountryList)
    Here is my schema and I run autotype target. produces errors
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    xmlns:tns="http://tutorial/sample8/"
    targetNamespace="http://tutorial/sample8/">
    <xsd:complexType name="World">
    <xsd:sequence>
    <xsd:element type="xsd:string" name="name"
    minOccurs="1" nillable="true" maxOccurs="1" />
    <xsd:element type="tns:Country" name="country"
    minOccurs="1" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:attribute name="population" type="xsd:long" />
    </xsd:complexType>
    <xsd:complexType name="Country">
    <xsd:sequence>
    <xsd:element type="xsd:string" name="name" minOccurs="1" />
    </xsd:sequence>
    <xsd:attribute name="population" type="xsd:long" />
    <xsd:attribute name="abbreviations">
    <xsd:simpleType>
    <xsd:list itemType="tns:TwoCharString" />
    </xsd:simpleType>
    </xsd:attribute>
    </xsd:complexType>
    <xsd:simpleType name="CountryList">
         <xsd:list itemType="tns:Country"/>
    </xsd:simpleType>
    <xsd:element name="countries" type="tns:CountryList"/>
    <xsd:complexType name="EUCountry">
    <xsd:complexContent>
    <xsd:extension base="tns:Country">
    <xsd:sequence>
    <xsd:element name="exchangeInfo" type="tns:ExchangeInformation" />
    </xsd:sequence>
    </xsd:extension>
    </xsd:complexContent>
    </xsd:complexType>
    <xsd:simpleType name="TwoCharString">
    <xsd:restriction base="xsd:NCName">
    <xsd:length value='2' />
    </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="ExchangeInformation">
    <xsd:simpleContent>
    <xsd:restriction base="xsd:float">
    <xsd:maxInclusive value="10000.0" />
    <xsd:attribute name="currency" type="tns:TwoCharString" />
    </xsd:restriction>
    </xsd:simpleContent>
    </xsd:complexType>
    </xsd:schema>

    What I have tryed is to do analyze the dbms_xml packages and I tried to do it the same way with the result:
    SQL> declare
    2 bar long raw;
    3
    4 FUNCTION foo RETURN raw IS
    5 EXTERNAL
    6 NAME "tidyCreate"
    7 LANGUAGE C
    8 LIBRARY TIDY_LIB
    9 PARAMETERS ( RETURN );
    10 begin
    11 bar := '1';
    12 bar := foo;
    13
    14 dbms_output.put_line(bar);
    15 end;
    16 /
    declare
    FEHLER in Zeile 1:
    ORA-06525: Lõngenfehlanpassung bei CHAR- oder RAW-Daten
    ORA-06512: in Zeile 4
    ORA-06512: in Zeile 12

  • Soap encoded array of complex type, impossible to map?

    Hello,
    can anyone please tell me if the XI has problems (or is unable) to read from soap-encoded arrays of a complex type.
    As far as I know this is conform to SOAP 1.1
    We developed this webservice for a client, who says, he cannot map this kind of array in his XI.
    Would it be better to do it this way ?
    <complexType name="ActivityList">
      <sequence>
        <element name="ActivityEl" maxOccurs="unbounded" type="Activity"/>
      </sequence>
    </complexType>
    Excerpt of the WSDL:
        <wsdl:message name="getDataForPbnrResponse">
            <wsdl:part name="getDataForPbnrReturn" type="impl:ArrayOf_tns1_Activity"/>
        </wsdl:message>
            <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ipslsv01vm02:9080/axis/services/QEC-Service">
                <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
                <complexType name="ArrayOf_tns1_Activity">
                    <complexContent>
                        <restriction base="soapenc:Array">
                            <attribute ref="soapenc:arrayType" wsdl:arrayType="tns1:Activity[]"/>
                        </restriction>
                    </complexContent>
                </complexType>
                <complexType name="ArrayOf_tns1_ActivityFeedback">
                    <complexContent>
                        <restriction base="soapenc:Array">
                            <attribute ref="soapenc:arrayType" wsdl:arrayType="tns1:ActivityFeedback[]"/>
                        </restriction>
                    </complexContent>
                </complexType>
            </schema>
    Part ot the response:
    <?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
      <ns1:getDataForPbnrResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://ipslsv01vm02:9080/axis/services/QEC-Service">
       <getDataForPbnrReturn xsi:type="soapenc:Array" soapenc:arrayType="ns3:Activity[7]" xmlns:ns2="http://www.w3.org/2002/12/soap-encoding" xmlns:ns3="urn:BeanService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
        <item href="#id0"/>
        <item href="#id1"/>
        <item href="#id2"/>
        <item href="#id3"/>
        <item href="#id4"/>
        <item href="#id5"/>
        <item href="#id6"/>
       </getDataForPbnrReturn>
      </ns1:getDataForPbnrResponse>
      <multiRef id="id5" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns4:Activity" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns4="urn:BeanService">
       <FIN xsi:type="xsd:string">---</FIN>
       <VIN xsi:type="xsd:string"></VIN>
    cut -
       <ursache xsi:type="xsd:string"></ursache>
      </multiRef>
    </soapenv:Body>
    </soapenv:Envelope>
    Thanks in advance!

    I am having this issue as well.
    From:
    http://help.sap.com/saphelp_nw04/helpdata/en/43/ce993b45cb0a85e10000000a1553f6/frameset.htm
    I see that:
    The WSDL document in rpc-style format must also not use any soapenc:Array types; these are often used in SOAP code in documents with this format. soapenc:Array uses the tag <xsd:any>, which the Integration Builder editors or proxy generation either ignore or do not support.
    You can replace soapenc:Array types with an equivalent <sequence>; see the WS-I  example under http://www.ws-i.org/Profiles/BasicProfile-1.0-2004-04-16.html#refinement16556272.
    They give an example of what to use instead.
    Of course I have been given a WSDL that has a message I need to map to that uses the enc:Array.
    Has anyone else had this issue?  I need to map to a SOAP message to send to an external party.  I don't know what they are willing to change to support what I can do.  I changed the WSDL to use a sequence as below just to pull it in for now.
    Thanks,
    Eric

  • Mapping problem Moving Complex Type to field

    Dear all,
    I am making a message using from RFC(ECC 6.0) to SOAP
    Some fields of the structure of RFC are:
    STRUCTURE_VALUE -> Complex Type
          END    - NUMC 20
          ID        - NUMC 3
          COST  - NUMC  5
          RATE  - NUMC  6
    The structure of Data Type to SOAP is:
    DATA_VALUE - STRING
    I need to concatenate the first structure in the second structure but I have too many fields in the STRUCTURE_VALUE and I don't want to use the function CONCATENATE in the MAPPING EDITOR. I would like to move the complex type STRUCTURE_VALUE to structure DATA_VALUE.
    Does anybody know if it's possible?
    Best regards,
    Fernando

    Hi,
    First of all what needs to be concatenated ? Each fields of the Source segment ?
    If so write a user defined function, which reads all the fields and retruns one concatenated field as an output.
    To know about this , you can go thru these- to understand the way how it works-and for e.g
    https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/be05e290-0201-0010-e997-b6e55f9548dd
    Rgds,
    Moorthy

  • Mapping Complex Types in a UDF

    Hi,
    I have a big text file that is very messed up that I need to clean up. I'm doing this clean up in a UDF. When doing the mapping, i would like to cater for the whole complex type and not just the individual nodes. Is this possible, and if so how?
    Thank you

    Hi,
    I would not recommend this doing in udf because it would be tedious. Also how will you read the whole complex file into one field when you also have other fields? May be if you can give the file here and tell us what you are trying to do then somebody can tell a design or an approach. Else if you feel that you cannot handle it in udf then you can try other mappings.
    Regards,
    ---Satish

  • BPM, webservices and complex types

    I have a WSDL wich has complext xml types, I create a webservice call in BPM. I get a SOAP fault string
    <?xml version="1.0" encoding="UTF-8" ?>
    <detail faultString="Unable to find a matching Operation for this remote invocation <ns1:createProduct xmlns:ns1="java:com.screwfix.xml.product">
         <ns1:description>From BPM</ns1:description>
    </ns1:createProduct>. Please check your operation name. " faultCode="Client">
    </detail>
    I can access the webservice externally but not through BPM. I can access webserivice without complex types, such as simple string....
    Looking at the error, it indicates that the soap client cannot process the request. Any ideas would be appreciated, we are using ALBPM 5.7
    Full exception :
    <?xml version="1.0" encoding="UTF-8" ?>
    <detail faultString="Unable to find a matching Operation for this remote invocation <ns1:createProduct xmlns:ns1="java:com.screwfix.xml.product">
         <ns1:description>From BPM</ns1:description>
    </ns1:createProduct>. Please check your operation name. " faultCode="Client">
    </detail>
    fuego.soaptype.SoapExecutionException: <?xml version="1.0" encoding="UTF-8" ?>
    <detail faultString="Unable to find a matching Operation for this remote invocation <ns1:createProduct xmlns:ns1="java:com.screwfix.xml.product">
         <ns1:description>From BPM</ns1:description>
    </ns1:createProduct>. Please check your operation name. " faultCode="Client">
    </detail>
         at fuego.soaptype.SoapCall.processRemoteException(SoapCall.java:531)
         at fuego.soaptype.SoapCall.invoke(SoapCall.java:292)
         at fuego.soaptype.SoapObject.invoke(SoapObject.java:272)
         at fuego.lang.Invokeable.invokeImpl(Invokeable.java:220)
         at fuego.lang.Invokeable.invoke(Invokeable.java:161)
         at fuego.compiler.Invoke$MethodCall.run(Invoke.java:1543)
         at fuego.compiler.Invoke.runCall(Invoke.java:710)
         at fuego.compiler.Invoke.run(Invoke.java:694)
         at fuego.compiler.Block.run(Block.java:317)
         at fuego.compiler.DoBlock.run(DoBlock.java:676)
         at fuego.compiler.Method.run(Method.java:1223)
         at fuego.compiler.Method$Adaptor.run(Method.java:1894)
         at fuego.compiler.FuegoInvokeable.invoke(FuegoInvokeable.java:426)
         at fuego.compiler.CodeRunner$DebuggerRunnable.runMethod(CodeRunner.java:756)
         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
         at java.lang.reflect.Method.invoke(Unknown Source)
         at fuego.lang.JavaClass.invokeMethod(JavaClass.java:1478)
         at fuego.lang.JavaObject.invoke(JavaObject.java:185)
         at fuego.component.Message.process(Message.java:585)
         at fuego.component.ExecutionThread.processMessage(ExecutionThread.java:759)
         at fuego.component.ExecutionThread.processBatch(ExecutionThread.java:734)
         at fuego.component.ExecutionThread.doProcessBatch(ExecutionThread.java:140)
         at fuego.component.ExecutionThread.doProcessBatch(ExecutionThread.java:132)
         at fuego.compiler.DebuggerPrincipal.processBatch(DebuggerPrincipal.java:62)
         at fuego.component.ExecutionThread.work(ExecutionThread.java:818)
         at fuego.component.ExecutionThread.run(ExecutionThread.java:397)
    Edited by masoodmjan at 06/19/2007 9:01 AM

    I found out that the retrieve method accepts columnSet as a
    class and id as a class. These are not strings that you can pass
    into MSCRM 3.0. However, I have no idea how to create a .NET
    acceptable class and pass it in. If you figured this out, or if
    others have thoughts, I'd love to hear how you've gone about it.
    Thank you!

  • Parsing xml for complex type using sax

    I have an xsd of below type:
    <xs:complexType name="itemInfo">
        <xs:sequence>
          <xs:element name="displayLineNumber" type="xs:string" minOccurs="0"/>
          <xs:element name="lineNumber" type="xs:integer" minOccurs="0"/>
          <xs:element name="parentLineNumber" type="xs:integer" minOccurs="0"/>
       <xs:element name="service" type="serviceInfo" minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
    </xs:complexType>
    <xs:complexType name="serviceInfo">
        <xs:sequence>
          <xs:element name="displayLineNumber" type="xs:string" minOccurs="0"/>
          <xs:element name="lineNumber" type="xs:integer" minOccurs="0"/>
          <xs:element name="serviceName" type="xs:string" minOccurs="0"/>
          <xs:element name="serviceDescription" type="xs:string" minOccurs="0"/>
          <xs:element name="subscriptionBand" type="subscriptionBandInfo" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="subscriptionBandInfo">
        <xs:sequence>
          <xs:element name="min" type="xs:long"/>
          <xs:element name="max" type="xs:long"/>
          <xs:element name="duration" type="xs:string" minOccurs="0"/>
          <xs:element name="price" type="xs:decimal"/>
        </xs:sequence>
      </xs:complexType>
    I have written a handler and able to handle simple type but how I can handle serviceInfo and subscriptionBandInfo as itemInfo is my root element.
    My handler class is:
    public class ProductHandler
      extends DefaultHandler
      //List to hold ProductInfo object
      private List<ProductInfo> productList = null;
      private ProductInfo product = null;
      public List<ProductInfo> getProductList()
        return productList;
      boolean bDisplayLineNumber = false;
      boolean bLineNumber = false;
      boolean bParentLineNumber = false;
      @Override
      public void startElement(String uri, String localName, String qName, Attributes attributes)
        throws SAXException
        if (qName.equalsIgnoreCase("item"))
        { //create a new ProductInfo and put it in Map
          //initialize ProductInfo object and set id attribute
          product = new ProductInfo();
          //initialize list
          if (productList == null)
            productList = new ArrayList<ProductInfo>();
        else if (qName.equalsIgnoreCase("name"))
          //set boolean values for fields, will be used in setting ProductInfo variables
          bName = true;
        else if (qName.equalsIgnoreCase("displayLineNumber"))
          bDisplayLineNumber = true;
        else if (qName.equalsIgnoreCase("lineNumber"))
          bLineNumber = true;
        else if (qName.equalsIgnoreCase("parentLineNumber"))
          bParentNumber = true;
      @Override
      public void endElement(String uri, String localName, String qName)
        throws SAXException
        if (qName.equalsIgnoreCase("item"))
          //add ProductInfo object to list
          productList.add(product);
      @Override
      public void characters(char ch[], int start, int length)
        throws SAXException
       if (bDisplayLineNumber)
          product.setDisplayLineNumber(Integer.parseInt(new String(ch, start, length)));
          bDisplayLineNumber = false;
       else if (bLineNumber)
          product.setLineNumber(Integer.parseInt(new String(ch, start, length)));
          bLineNumber = false;
        else if (bParentNumber)
          product.setParentNumber(Integer.parseInt(new String(ch, start, length)));
          bParentNumber = false;
      @Override
      public void endElement(String uri, String localName, String qName)
        throws SAXException
        if (qName.equalsIgnoreCase("item"))
          //add ProductInfo object to list
          productList.add(product);
    My ProductInfo class is:
    import com.vpc.schema.ServiceInfo;
    import java.util.ArrayList;
    import java.util.List;
    public class ProductInfo
      private String category, family, subGroup, size, productType, availability;
      private String displayLineNumber;
      private int lineNumber;
      private int parentNumber;
    private List<ServiceInfo> serviceInfo;
      public int getLineNumber()
        return lineNumber;
      public int getParentNumber()
        return parentNumber;
      public List<ServiceInfo> getServiceInfo()
        if (serviceInfo == null)
          serviceInfo = new ArrayList<ServiceInfo>();
        return serviceInfo;
      public void setServiceInfo(List<ServiceInfo> serviceInfo)
        this.serviceInfo = serviceInfo;
    I am able to do parsing for my simple type but when a complex type comes I am not able to do it. So please suggest how I can add complex type

    I suppose the posting of xsd is to show the structure of the xml...
    In any case, I can suggest a couple of things to do for the purpose.
    [1] If you still follow the same line of reasoning using some boolean like bDisplayLineNumber etc to identify the position of the parser traversing the document, you can complete the logic adding bItem (which you did not need under simplified consideration) and bService and bSubscriptionBand to identify at the parent or the grandparent in the case of the "complexType" serviceInfo and even the great-grand-parent in the case of arriving to the complexType subscriptionBandInfo...
    [1.1] With those boolean value, you determine bDisplayLineNumber etc under item directly, and then as well say bDisplayLineNumber_Service under the service etc and then bMin_SubscriptionBand etc under subscriptionBand etc. You just expand the number of those variables to trigger the setting of those fields in the object product, service in the serviceList and subscriptionBand in the subscriptionBandList etc etc.
    [1.2] All the reset of those booleans should be done in the endElement() method rather than in characters() method. That is logically more satisfactory and has a bearing in case there is a mixed content type.
    [1.3] Then when arriving at startElement of service, you make sure you initiate the serviceList, same for subscriptionBand the subscriptionList...
    [1.4] Then when arriving at endElement of service, you use setServiceInfo() setter to pass the serviceList to product and the same when arriving at endElement of serviceBand, you use setSubscriptionBand() setter to pass the subscriptionBand to service.
    ... and then basically that's is it, somewhat laborious and repetitive but the logical layout is clear. (As a side-note, you shouldn't use equalsIgnoreCase(), why should you? xml is case sensitive.)
    [2] Actually, I would suggest a much neater approach, especially when you probe many more levels of complexType. It would be even appear cleaner when you have two levels of depth already...
    [2.1] You maintain a Stack (or an implementation class of Deque, but Stack is largely sufficient here) of element name to guide the parser identifying its whereabout. By such doing, you get ride of all those bXXX's.
    This is a rewrite of the content handler using this approach and I only write the code of capturing service. Adding serviceBand is a matter of repetition of how it is done on service. And it is already clear it appears a lot neater as far as I'm concerned.
    public class ProductHandler extends DefaultHandler {
    Stack<String> tagstack=new Stack<String>();
    private List<ProductInfo> productList = null;
    private ProductInfo product = null;
    private List<ServiceInfo> serviceList=null;
    private ServiceInfo service=null;
    public List<ProductInfo> getProductList() {
      return productList;
    public List<ServiceInfo> getServiceList() {
      return serviceList;
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) {
      if (qName.equals("item")) {
       product = new ProductInfo();
       //initialize list
       if (productList == null) {
        productList = new ArrayList<ProductInfo>();
      } else if (qName.equals("service") && tagstack.peek().equals("item")) {
       service=new ServiceInfo();
       if (serviceList==null) {
        serviceList=new ArrayList<ServiceInfo>();
      tagstack.push(qName);
    @Override
    public void endElement(String uri, String localName, String qName) {
      if (tagstack.peek().equals("item")) {
       //add ProductInfo object to list
       productList.add(product);
      } else if (tagstack.peek().equals("service") && tagstack.search("item")==2) {
       serviceList.add(service);
       product.setServiceInfo(serviceList);
      tagstack.pop();
    @Override
    public void characters(char ch[], int start, int length) throws SAXException {
      String currentName=tagstack.peek();
      int itemPos=tagstack.search("item");
      int servicePos=tagstack.search("service");
      if (currentName.equals("name") && itemPos==2)  {
       product.setName(new String(ch, start, length));
      } else if (currentName.equals("displayLineNumber") && itemPos==2) {
       product.setDisplayLineNumber(Integer.parseInt(new String(ch, start, length)));
      } else if (currentName.equals("lineNumber") && itemPos==2) {
       product.setLineNumber(Integer.parseInt(new String(ch, start, length)));
      } else if (currentName.equals("parentLineNumber") && itemPos==2) {
       product.setParentLineNumber(Integer.parseInt(new String(ch, start, length)));
      } else if (currentName.equals("displayLineNumber") && servicePos==2 && itemPos==3) {
       service.setDisplayLineNumber(Integer.parseInt(new String(ch, start, length)));
      } else if (currentName.equals("lineNumber") && servicePos==2 && itemPos==3) {
       service.setLineNumber(Integer.parseInt(new String(ch, start, length)));
      } else if (currentName.equals("serviceName") && servicePos==2 && itemPos==3) {
       service.setServiceName(new String(ch, start, length));
      } else if (currentName.equals("serviceDescription") && servicePos==2 && itemPos==3) {
       service.setServiceDescription(new String(ch, start, length));

  • Multi-Mapping in IDOC without using BPM ?

    Hi ,
    Please check ..
    Can below given blog can be used to achive Multi-mapping in IDOC without using BPM ?
    /people/jin.shin/blog/2006/02/07/multi-mapping-without-bpm--yes-it146s-possible
    Regards
    PS

    Solved .. Thx every one .
    Approache Used :
    1. Created mapping  with Change signature on target Message type(idoc) with 1..N Occurence.
    2. Operation mapping with change Occurence on Target Operation(1..Unbounded) .
    3. Used same Operation mapping in Interface Determination with 0..unbounded(Multiplicity).

  • Web service Complex type

    hello i want to ask if i can make a complex type that is composed of many other classes and witch databinding framework should i use to do do the mapping from xml to my one classes not the auto generated classes thanks for your help.

    Hi Ray,
    I just had you set your "per" object to its constructor out of habit. Don't know about you, but I spend too much time chasing null pointer exceptions.
    Try this. It's easy and quick.
    1) Hold your mouse over the ObtenerPersonaActivaDadoCI() method in the Project Navigator tab. By doing this, I'm guessing you'll see it's not returning a Persona object.
    or
    2) Simply drag the ObtenerPersonaActivaDadoCI() method from the Project Navigator tab into your logic. By doing this, you'll notice that it has a value in front of the "=" sign. Again, I'm guessing you'll see it's not returning a Persona object.
    Even though the Persona object and the object that ObtenerPersonaActivaDadoCI() returns both have the same list of attributes, I believe that you'll continue to get the error you're seeing if you try to set per (since it's an Persona object) to the value returned form ObtenerPersonaActivaDadoCI().
    To get around the problem, let's say you instead have the ObtenerPersonaActivaDadoCI() method return it's value to an "opadCI" object (the type of object you found out that the method returns by doing 1 or 2 above). You might want to fix your problem by doing something like this:
    per.firstAttr = opadCI.firstAttr
    per.sedondAttr = opadCI.sedondAttr
    per.thirdAttr = opadCI.thirdAttr
    Hope this helps,
    Dan

  • How to map a complex XML message onto a flattened XSD for multi line insert

    Hi Experts.
    I have a webservice in my composite that takes an xml message that contains repeating complex type elements. The XSD is as follows:
    <?xml version= '1.0' encoding= 'UTF-8' ?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:XxInt003Stg="http://www.somewhere.co.uk/xxx/integration/int003Stage"
    targetNamespace="http://www.somewhere.co.uk/xxx/integration/int003Stage" elementFormDefault="qualified">
    <xsd:complexType name="InterfaceFileType">
    <xsd:sequence>
    <xsd:element name="FileName" type="xsd:string"/>
    <xsd:element name="FileSource" type="xsd:string"/>
    <xsd:element name="FileIdentifier" type="xsd:integer"/>
    <xsd:element name="InterfaceInvoices" type="XxInt003Stg:InterfaceInvoicesType"/>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="InterfaceInvoicesType">
    <xsd:sequence>
    <xsd:element name="InterfaceInvoice" type="XxInt003Stg:InterfaceInvoiceType"
    maxOccurs="unbounded"/>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="InterfaceInvoiceType">
    <xsd:sequence>
    <xsd:element name="SupplierNumber" type="xsd:string"/>
    <xsd:element name="SupplierSite" type="xsd:string"/>
    <xsd:element name="InvoiceNumber" type="xsd:string"/>
    <xsd:element name="InterfaceInvoiceLines">
    <xsd:complexType>
    <xsd:complexContent>
    <xsd:extension base="XxInt003Stg:InterfaceInvoiceLinesType">
    <xsd:sequence>
    <xsd:element name="InterfaceInvoiceLine"
    type="XxInt003Stg:InterfaceInvoiceLineType"
    maxOccurs="unbounded"/>
    </xsd:sequence>
    </xsd:extension>
    </xsd:complexContent>
    </xsd:complexType>
    </xsd:element>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="InterfaceInvoiceLinesType"/>
    <xsd:complexType name="InterfaceInvoiceLineType">
    <xsd:sequence>
    <xsd:element name="LineAmount" type="xsd:decimal" nillable="false"/>
    <xsd:element name="TaxAmount" type="xsd:decimal"/>
    <xsd:element name="BusinessEntityReference" type="xsd:string"/>
    <xsd:element name="AccountNumber" type="xsd:string"/>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:element name="InterfacePayload">
    <xsd:complexType>
    <xsd:sequence>
    <xsd:element name="InterfaceFiles" type="XxInt003Stg:InterfaceFileType"
    maxOccurs="unbounded"/>
    </xsd:sequence>
    </xsd:complexType>
    </xsd:element>
    </xsd:schema>
    When I try to push this through the database adapter after mapping the fields it inserts multiple rows but they are all the same values. I have put a for-each XSLT construct based on the lowest element in the XSD (Invoice Line) and allocated that at various places on the target tree structure but with no success.
    The XSLT is as follows:
    <xsl:template match="/">
    <top:XxInt003InterfaceInvoiceStgCollection>
    <top:XxInt003InterfaceInvoiceStg>
    <top:fileName>
    <xsl:value-of select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:FileName"/>
    </top:fileName>
    <top:fileSource>
    <xsl:value-of select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:FileSource"/>
    </top:fileSource>
    <top:fileIdentifier>
    <xsl:value-of select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:FileIdentifier"/>
    </top:fileIdentifier>
    <top:supplierNumber>
    <xsl:value-of select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:InterfaceInvoices/inp1:InterfaceInvoice/inp1:SupplierNumber"/>
    </top:supplierNumber>
    <top:supplierSite>
    <xsl:value-of select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:InterfaceInvoices/inp1:InterfaceInvoice/inp1:SupplierSite"/>
    </top:supplierSite>
    <top:invoiceNumber>
    <xsl:value-of select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:InterfaceInvoices/inp1:InterfaceInvoice/inp1:InvoiceNumber"/>
    </top:invoiceNumber>
    <xsl:for-each select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:InterfaceInvoices/inp1:InterfaceInvoice/inp1:InterfaceInvoiceLines/inp1:InterfaceInvoiceLine">
    <top:lineAmount>
    <xsl:value-of select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:InterfaceInvoices/inp1:InterfaceInvoice/inp1:InterfaceInvoiceLines/inp1:InterfaceInvoiceLine/inp1:LineAmount"/>
    </top:lineAmount>
    </xsl:for-each>
    <top:taxAmount>
    <xsl:value-of select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:InterfaceInvoices/inp1:InterfaceInvoice/inp1:InterfaceInvoiceLines/inp1:InterfaceInvoiceLine/inp1:TaxAmount"/>
    </top:taxAmount>
    <top:businessEntityReference>
    <xsl:value-of select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:InterfaceInvoices/inp1:InterfaceInvoice/inp1:InterfaceInvoiceLines/inp1:InterfaceInvoiceLine/inp1:BusinessEntityReference"/>
    </top:businessEntityReference>
    <top:accountNumber>
    <xsl:value-of select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:InterfaceInvoices/inp1:InterfaceInvoice/inp1:InterfaceInvoiceLines/inp1:InterfaceInvoiceLine/inp1:AccountNumber"/>
    </top:accountNumber>
    </top:XxInt003InterfaceInvoiceStg>
    </top:XxInt003InterfaceInvoiceStgCollection>
    </xsl:template>
    I am sure this is just something fundemantal I am doing, is it something to do with the inp1 bit of the XSLT? I get the feeling this should be looping somehow?
    Thanks
    Keith

    Hi,
    as I understand you try to transform 'InterfacePayload' (your XSD - just easier to read here)
    InterfacePayload (1:1)
    -- InterfaceFiles (1:N)
    ---- FileName (1:1)
    ---- FileSource (1:1)
    ---- FileIdentifier (1:1)
    ---- InterfaceInvoices (1:1)
    ------ InterfaceInvoice (1:N)
    -------- SupplierNumber (1:1)
    -------- SupplierSite (1:1)
    -------- InvoiceNumber (1:1)
    -------- InterfaceInvoiceLines (1:1)
    ---------- InterfaceInvoiceLine (1:N)
    ------------ LineAmount (1:1)
    ------------ TaxAmount (1:1)
    ------------ BusinessEntityReference (1:1)
    ------------ AccountNumber (1:1)
    to 'XxInt003InterfaceInvoiceStgCollection' (extracted from your XSLT)
    XxInt003InterfaceInvoiceStgCollection (1:1)
    -- XxInt003InterfaceInvoiceStg (1:1)
    ---- fileName (1:1)
    ---- fileSource (1:1)
    ---- fileIdentifier (1:1)
    ---- supplierNumber (1:1)
    ---- supplierSite (1:1)
    ---- invoiceNumber (1:1)
    ---- lineAmount (1:N)
    ---- taxAmount (1:1)
    ---- businessEntityReference (1:1)
    ---- accountNumber (1:1)
    In the 'xsl:for-each' construct
    +<xsl:for-each select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:InterfaceInvoices/inp1:InterfaceInvoice/inp1:InterfaceInvoiceLines/inp1:InterfaceInvoiceLine">+
    +<top:lineAmount>+
    +<xsl:value-of select="/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:InterfaceInvoices/inp1:InterfaceInvoice/inp1:InterfaceInvoiceLines/inp1:InterfaceInvoiceLine/inp1:LineAmount" />+
    +</top:lineAmount>+
    +</xsl:for-each>+
    - you are asking to iterate through all available 'inp1:InterfaceInvoiceLine' elements in the input XML document
    - the value of the element 'top:lineAmount' (for each iteration) is being calculated as all values of available 'inp1:LineAmount' elements in the input XML document together
    So, if you have ... lets say
    - 4x 'inp1:InterfaceInvoiceLine' element in the input XML document, each containing one 'inp1:LineAmount' element ... with values {1, 2, 3, 4} respectively
    - the output will be something like this
    <top:lineAmount>1234</top:lineAmount>
    <top:lineAmount>1234</top:lineAmount>
    <top:lineAmount>1234</top:lineAmount>
    <top:lineAmount>1234</top:lineAmount>
    Why are you always querying from +/inp1:InterfacePayload/inp1:InterfaceFiles/...+ ?
    I think ... all Xpath queries in your XSLT are wrong (they query something else than you think).
    e.g.
    - putting all file names together into one element (+/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:FileName+)
    - putting all file sources together into one element (+/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:FileSource+)
    - putting all invoice numbers together into one element (+/inp1:InterfacePayload/inp1:InterfaceFiles/inp1:InterfaceInvoices/inp1:InterfaceInvoice/inp1:InvoiceNumber+)
    Best regards,
    Martin.

  • Xquery mapping from Complext type to Array type

    Hi,
    please help to solve this , i will post my source xsd nad target xsd,source has complex type and target xsd has assry type ,i need a direct mapping with elements[one to one mappling]
    pls help me to solve,
    SOURCE XSD
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="updateOrderStatus">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="orderStatusUpdate">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="orderDetails">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="lineItems">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="lineItemList">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="item" minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
    <xs:sequence>
    <xs:element type="xs:string" name="itemStatus"/>
    <xs:element name="shippingDetail">
    <xs:complexType>
    <xs:sequence>
    <xs:element type="xs:int" name="quantity"/>
    <xs:element type="xs:string" name="shipper"/>
    <xs:element type="xs:string" name="trackingNumber"/>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    <xs:element type="xs:string" name="skuId"/>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    <xs:element type="xs:string" name="orderId"/>
    <xs:element type="xs:string" name="orderStatus"/>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    </xs:schema>
    TARAGET XSD
    <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://www.atg.com/com.nbty.commerce.integration.orderstatusupdate" xmlns:tns="http://www.atg.com/com.nbty.commerce.integration.orderstatusupdate" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <complexType name="OrderStatusUpdate">
    <all>
    <element name="orderDetails" nillable="true" type="tns:OrderDetails"/>
    <element name="orderId" nillable="true" type="xsd:string"/>
    <element name="orderStatus" nillable="true" type="xsd:string"/>
    </all>
    </complexType>
    <complexType name="OrderDetails">
    <all>
    <element name="lineItems" nillable="true" type="tns:LineItems"/>
    </all>
    </complexType>
    <complexType name="LineItems">
    <all>
    <element name="lineItemList" nillable="true" type="tns:ArrayOfLineItem"/>
    </all>
    </complexType>
    <complexType name="ArrayOfLineItem">
    <complexContent>
    <restriction base="soap-enc:Array">
    <attribute ref="soap-enc:arrayType" wsdl:arrayType="tns:LineItem[]"/>
    </restriction>
    </complexContent>
    </complexType>
    <complexType name="LineItem">
    <all>
    <element name="itemStatus" nillable="true" type="xsd:string"/>
    <element name="shippingDetail" nillable="true" type="tns:ShippingDetail"/>
    <element name="skuId" nillable="true" type="xsd:string"/>
    </all>
    </complexType>
    <complexType name="ShippingDetail">
    <all>
    <element name="quantity" nillable="true" type="xsd:string"/>
    <element name="shipper" nillable="true" type="xsd:string"/>
    <element name="trackingNumber" nillable="true" type="xsd:string"/>
    </all>
    </complexType>
    </schema>
    regards
    Abhi

    Hi,
    Here's a query that should answer part of the question :
    <student>
      for $i in doc("doc.xml")/student/*
      return
       <field name="{upper-case(name($i))}">
        if ($i/*) then string-join($i/*, ";")
        else $i/text()
       </field>
    </student>It deals with all possible children of the student node. If a child has descendants, then their values are aggregated like you require, else just the child value is used.
    Additional question : where do the default values come from? Do we just have to "paste" the string "default1;default2;default3" as a whole?
    HTH.

Maybe you are looking for