이 섹션은 SOAP 인코드 배열 유형을 갖는 XML 스키마를 이주 또는 처리하는 방법을 설명합니다.
SCA 응용프로그램이 soapend:Array 유형을 사용하는 외부 서비스를 호출해야 하는 경우가 있습니다. 일부 경우에 이를 피할 수 있는 방법이 없으며 다음은 이 상황을 다루는 방법을 보여 줍니다.
<xsd:complexType name="Vendor"> <xsd:all> <xsd:element name="name" type="xsd:string" /> <xsd:element name="phoneNumber" type="xsd:string" /> </xsd:all> </xsd:complexType> </xsd:schema> <xsd:complexType name="Vendors"> <xsd:complexContent mixed="false"> <xsd:restriction base="soapenc:Array"> <xsd:attribute wsdl:arrayType="tns:Vendor[]" ref="soapenc:arrayType" xmlnxsd:wsdl="http://schemas.xmlsoap.org/wsdl/" /> </xsd:restriction> </xsd:complexContent> <xsd:complexType name="VendorsForProduct"> <xsd:all> <xsd:element name="productId" type="xsd:string" /> <xsd:element name="vendorList" type="tns:Vendors" /> </xsd:all> </xsd:complexType> <xsd:complexType name="Product"> <xsd:all> <xsd:element name="productId" type="xsd:string" /> <xsd:element name="productName" type="xsd:string" /> </xsd:all> </xsd:complexType> <message name="doFindVendorResponse"> <part name="returnVal" type="tns:VendorsForProduct" /> </message> <operation name="doFindVendor"> <input message="tns:doFindVendor" /> <output message="tns:doFindVendorResponse" /> </operation>
// Locate the vendor service and find the doFindVendor operationService // findVendor=(Service)ServiceManager.INSTANCE.locateService("vendorSearch"); OperationType doFindVendorOperationType=findVendor.getReference().getOperationType("doGoogleSearch"); // Create the input DataObject DataObject doFindVendor=DataFactory.INSTANCE.create(doFindVendorOperationType.getInputType()); doFindVendor.setString("productId", “12345”); doFindVendor.setString("productName", “Refrigerator”); // Invoke the FindVendor service DataObject FindVendorResult = (DataObject)findVendor.invoke(doFindVendorOperationType, doFindVendor); // Display the results int resultProductId=findVendorResult.getString("productId"); DataObject resultElements=findVendorResult.getDataObject("vendorList"); Sequence results=resultElements.getSequence(0); for (int i=0, n=results.size(); i for (int i=0, n=results.size(); i
다음은 데이터 오브젝트의 루트 유형이 soapenc:Array인 다른 예제입니다. sampleElements DataObject가 위에 나열된 두 번째 스키마를 사용하여 작성되는 방식을 주목하십시오. 먼저 DataObject의 유형을 얻은 다음 sampleStructElement의 특성을 얻습니다. 이것이 실제로는 플레이스홀더 특성이며 DataObjects를 시퀀스에 추가할 때 사용할 유효한 특성을 얻기 위해서만 사용됩니다. 이와 비슷한 패턴을 사용자 시나리오에서 사용할 수 있습니다.
<s:schema elementFormDefault="qualified" targetNamespace="http://soapinterop.org/xsd"> <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> <s:import namespace="http://schemas.xmlsoap.org/wsdl/" /> <s:complexType name="SOAPStruct"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="varInt" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="varString" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="varFloat" type="s:float" /> </s:sequence> </s:complexType> <s:complexType name="ArrayOfSOAPStruct"> <s:complexContent mixed="false"> <s:restriction base="soapenc:Array"> <s:attribute wsdl:arrayType="s0:SOAPStruct[]" ref="soapenc:arrayType" /> </s:restriction> </s:complexContent> </s:complexType> </s:schema> <wsdl:message name="echoStructArraySoapIn"> <wsdl:part name="inputStructArray" type="s0:ArrayOfSOAPStruct" /> </wsdl:message> <wsdl:message name="echoStructArraySoapOut"> <wsdl:part name="return" type="s0:ArrayOfSOAPStruct" /> </wsdl:message> <wsdl:operation name="echoStructArray"> <wsdl:input message="tns:echoStructArraySoapIn" /> <wsdl:output message="tns:echoStructArraySoapOut" /> </wsdl:operation> <schema targetNamespace="http://sample/elements" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://sample/elements"> <element name="sampleStringElement" type="string"/> <element name="sampleStructElement" type="any"/> </schema>
// Create the input DataObject and get the SDO sequence for the any // element DataFactory dataFactory=DataFactory.INSTANCE; DataObject arrayOfStruct = dataFactory.create("http://soapinterop.org/xsd","ArrayOfSOAPStruct"); Sequence sequence=arrayOfStruct.getSequence("any"); // Get the SDO property for the sample element that we want to use // here to populate the sequence // We have defined this element in an XSD file, see SampleElements.xsd DataObject sampleElements=dataFactory.create("http://sample/elements", "DocumentRoot"); Property property = sampleElements.getType().getProperty("sampleStructElement"); // Add the elements to the sequence DataObject item=dataFactory.create("http://soapinterop.org/xsd", "SOAPStruct"); item.setInt("varInt", 1); item.setString("varString", "Hello"); item.setFloat("varFloat", 1.0f); sequence.add(property, item); item=dataFactory.create("http://soapinterop.org/xsd", "SOAPStruct"); item.setInt("varInt", 2); item.setString("varString", "World"); item.setFloat("varFloat", 2.0f); sequence.add(property, item); // Invoke the echoStructArray operation System.out.println("[client] invoking echoStructArray operation"); DataObject echoArrayOfStruct = (DataObject)interopTest.invoke("echoStructArray", arrayOfStruct); // Display the results if (echoArrayOfStruct!=null) { sequence=echoArrayOfStruct.getSequence("any"); for (int i=0, n=sequence.size(); i<n; i++) { item=(DataObject)sequence.getValue(i); System.out.println("[client] item varInt = "+ item.getInt("varInt")+" varString="+item.getString("varString")+" varFloat="+item.getFloat("varFloat"));