I am trying to read xml tags from a document using QtXQuery. Works out fine besides a '\n'-char that is attached to each query-result. Moreover using the last()-statement on a collection returns the expected number of items in the collection with a trailing repetition + '\n'.
Why QXmlQuery seem to add a ` \n` to results? (and how to solve it?) suggest to use a QStringList and only take the first item into account, yet this does not seem to work with my setup as using a QStringList on query.evaluateTo(&qsl) fails to return any results. So: my question is if this is a bug in libqt5xmlPatterns5 or if my implementation is the reason for this behavior? Am I missing some details on how to use QtXmlQuery?
So here is the piece of code:
get_tag_value:
static lib_int_err_t get_tag_value(QString *result, QUrl schema_file, QString xml_file_name, QString var_name, QString query_str)
{
lib_int_err_t ret_code = LIE_OK;
QFile *xml_f= new QFile(xml_file_name);
xml_f->open(QIODevice::ReadOnly);
if(result!=nullptr){
result->clear();
QXmlSchema xmlschema;
// QStringList *results = new QStringList();
xmlschema.load(schema_file);
QXmlQuery query(QXmlQuery::XQuery10, xmlschema.namePool());
query.bindVariable(var_name, xml_f);
query.setQuery(query_str);
query.evaluateTo(result);
// result->append(results->first());
ret_code = LIE_OK;
}
else{
ret_code = LIE_XML_MALFORMED;
}
xml_f->close();
return ret_code;
}
The input query string:
'declare copy-namespaces no-preserve, inherit; declare variable $" + var_name + " external; doc($" + var_name + ")" + "//procLib/last()" '
The schema used for data description:
<xs:element name="toolConfig">
<xs:complexType>
<xs:sequence>
<xs:element name="processingLibsSettings">
<xs:complexType>
<xs:sequence>
<xs:element name="interfaceSchemaDef" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="interfaceSchemaPath" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="processingLibsInstances">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="procLib" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="procLibConfigName" type="xs:string"/>
<xs:element name="procLibConfigPath" type="xs:string"/>
<xs:element name="procLibName" type="xs:string"/>
<xs:element name="procLibPath" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="installDir" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Solved this with a workaround:
results=results.remove('\n');
results=results.split(' ')[0];
not really nice, but it works...
Related
I am trying to create a soap web service for a server using jax-ws following this xml schema:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="OfeliaDataEx">
<xs:complexType>
<xs:sequence>
<xs:element ref="Header"/>
<xs:element ref="User"/>
<xs:element ref="Data"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Header">
<xs:complexType>
<xs:sequence>
<xs:element ref="State"/>
<xs:element ref="TypeReq"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="State" type="xs:string"/>
<xs:element name="TypeReq" type="xs:string"/>
<xs:element name="User">
<xs:complexType>
<xs:sequence>
<xs:element ref="JabberID"/>
<xs:element ref="OpenID"/>
<xs:element ref="OauthToken"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="JabberID" type="xs:string"/>
<xs:element name="OpenID" type="xs:anyURI"/>
<xs:element name="OauthToken">
<xs:complexType>
<xs:sequence>
<xs:element ref="AuthToken"/>
<xs:element ref="TokenSecret"/>
<xs:element ref="ExpireDate"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="AuthToken" type="xs:string"/>
<xs:element name="TokenSecret" type="xs:string"/>
<xs:element name="ExpireDate" type="xs:string"/>
<xs:element name="Data">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="POSI"/>
<xs:element ref="TESTE"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="POSI">
<xs:complexType>
<xs:all>
<xs:element ref="TimeStamp"/>
<xs:element ref="RefreshInterval"/>
<xs:element ref="Lon"/>
<xs:element ref="Lat"/>
<xs:element ref="Data"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="RefreshInterval" nillable="true" type="xs:integer"/>
<xs:element name="Lon" nillable="true" type="xs:float"/>
<xs:element name="Lat" nillable="true" type="xs:float"/>
<xs:element name="TESTE">
<xs:complexType>
<xs:all>
<xs:element ref="TimeStamp"/>
<xs:element ref="cenas"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="cenas" nillable="true" type="xs:float"/>
<xs:element name="TimeStamp" type="xs:string"/>
</xs:schema>
My first try was follow a POJO model how ever i did not have any success. I couldnt reproduce the <xs:choice minOccurs="0" maxOccurs="unbounded">. So i am here to ask for an idea to create a soap web service that follows this schema.
best regards,
Why don't you use the xjc tool which comes with your JDK and creates the required jax-b artifacts from a xsd...
something like this will create the classes in the 'generated' subfolder of the current directory:
xjc /the/path/to/my/xsdfile.xsd
Also look here: http://docs.oracle.com/javase/6/docs/technotes/tools/share/xjc.html
I am trying to insert primary and foreign keys in XSD schema file below :-
Primary key is StudentID and Foreign Keys are courseID, AddressID, GradeID.
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Student">
<xs:complexType>
<xs:sequence>
<xs:element name="Title" type="xs:string"/>
<xs:element name="FirstName" type="xs:string"/>
<xs:element name="LastName" type="xs:string"/>
<xs:element name="Dateborn" type="xs:date"/>
<xs:element name="Gender" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
However above code is not working in my setup please help me in tracing the issue,
In general you would need to put more details in a question... So this should be enough to understand what else you might need to define, and how. I'll tackle what's needed to understand how to define a primary key/foreign key by illustrating an assumed student/address relationship.
First you need to define a context where these constraints hold true. In my modified XSD, I call it the "World".
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="World">
<xs:complexType>
<xs:sequence>
<xs:element ref="Student" maxOccurs="unbounded"/>
<xs:element ref="Address" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:key name="PKStudents">
<xs:selector xpath="Student/StudentID"/>
<xs:field xpath="."/>
</xs:key>
<xs:key name="PKAddresses">
<xs:selector xpath="Address/AddressID"/>
<xs:field xpath="."/>
</xs:key>
<xs:keyref name="FKStudentToAddress" refer="PKAddresses">
<xs:selector xpath="Student/AddressID"/>
<xs:field xpath="."/>
</xs:keyref>
</xs:element>
<xs:element name="Student">
<xs:complexType>
<xs:sequence>
<xs:element name="Title" type="xs:string"/>
<xs:element name="FirstName" type="xs:string"/>
<xs:element name="LastName" type="xs:string"/>
<xs:element name="Dateborn" type="xs:date"/>
<xs:element name="Gender" type="xs:string"/>
<xs:element name="StudentID" type="xs:string"/>
<xs:element name="AddressID" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Address">
<xs:complexType>
<xs:sequence>
<xs:element name="AddressID" type="xs:string"/>
<xs:element name="Street" type="xs:string"/>
<xs:element name="City" type="xs:string"/>
<xs:element name="Province" type="xs:string" minOccurs="0"/>
<xs:element name="Country" type="xs:date" minOccurs="0"/>
<xs:element name="PostalCode" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Then an XML like this would pass or fail, depending on what you do with the values in the StudentID and AddressID fields.
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<World xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Student>
<Title>Title1</Title>
<FirstName>FirstName1</FirstName>
<LastName>LastName1</LastName>
<Dateborn>1900-01-01</Dateborn>
<Gender>Gender1</Gender>
<StudentID>StudentID1</StudentID>
<AddressID>AddressID1</AddressID>
</Student>
<Student>
<Title>Title1</Title>
<FirstName>FirstName1</FirstName>
<LastName>LastName1</LastName>
<Dateborn>1900-01-01</Dateborn>
<Gender>Gender1</Gender>
<StudentID>StudentID2</StudentID>
<AddressID>AddressID1</AddressID>
</Student>
<Address>
<AddressID>AddressID1</AddressID>
<Street>Street1</Street>
<City>City1</City>
<Province>Province1</Province>
<Country>1900-01-01</Country>
<PostalCode>PostalCode1</PostalCode>
</Address>
<Address>
<AddressID>AddressID2</AddressID>
<Street>Street1</Street>
<City>City1</City>
<Province>Province1</Province>
<Country>1900-01-01</Country>
<PostalCode>PostalCode1</PostalCode>
</Address>
</World>
To finish your solution, you would need to define the Course and Grade "entities" in your "world", define the xs:key for each, similar to Student/*Address*, then add CourseID and GradeID attributes to the entities that need them, and finally, define the keyref, as above, for Entity to Grade and Entity to Course.
I'm a newby using asp and webservice technologies. I'm trying to read a Web Service and work with data returned.
My Web Service returns many fields, so I'm looking for the best way to use this returned data.
The XML returned by my Web Service looks like this:
<DataSet xmlns="http://tempuri.org/wsexportaproducto/Productos">
<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Exportacion">
<xs:complexType>
<xs:sequence>
<xs:element name="gtin" type="xs:string" minOccurs="0"/>
<xs:element name="gtinreemplazado" type="xs:string" minOccurs="0"/>
<xs:element name="refidcateglobal" type="xs:string" minOccurs="0"/>
<xs:element name="refidcatelocal" type="xs:decimal" minOccurs="0"/>
<xs:element name="gln" type="xs:string" minOccurs="0"/>
<xs:element name="glnfabricante" type="xs:string" minOccurs="0"/>
<xs:element name="nombrefabricante" type="xs:string" minOccurs="0"/>
<xs:element name="refpaismercado" type="xs:string" minOccurs="0"/>
<xs:element name="iniciovigenciadn" type="xs:dateTime" minOccurs="0"/>
<xs:element name="finvigenciadn" type="xs:dateTime" minOccurs="0"/>
<xs:element name="vida" type="xs:decimal" minOccurs="0"/>
<xs:element name="nomproducto" type="xs:string" minOccurs="0"/>
<xs:element name="marca" type="xs:string" minOccurs="0"/>
<xs:element name="descproducto" type="xs:string" minOccurs="0"/>
<xs:element name="descripcioncorta" type="xs:string" minOccurs="0"/>
<xs:element name="profundo" type="xs:decimal" minOccurs="0"/>
<xs:element name="unidprofundo" type="xs:string" minOccurs="0"/>
<xs:element name="alto" type="xs:decimal" minOccurs="0"/>
<xs:element name="unidalto" type="xs:string" minOccurs="0"/>
<xs:element name="ancho" type="xs:decimal" minOccurs="0"/>
<xs:element name="unidancho" type="xs:string" minOccurs="0"/>
<xs:element name="pesobruto" type="xs:decimal" minOccurs="0"/>
<xs:element name="unidpesobruto" type="xs:string" minOccurs="0"/>
<xs:element name="pesoempaque" type="xs:decimal" minOccurs="0"/>
<xs:element name="unidpesoempaque" type="xs:string" minOccurs="0"/>
<xs:element name="contenidoneto" type="xs:decimal" minOccurs="0"/>
<xs:element name="unidcontenidoneto" type="xs:string" minOccurs="0"/>
<xs:element name="escontenidovariable" type="xs:boolean" minOccurs="0"/>
<xs:element name="refembalaje" type="xs:string" minOccurs="0"/>
<xs:element name="esretornable" type="xs:boolean" minOccurs="0"/>
<xs:element name="factorestiba" type="xs:decimal" minOccurs="0"/>
<xs:element name="esunidadminima" type="xs:boolean" minOccurs="0"/>
<xs:element name="contenidos" type="xs:string" minOccurs="0"/>
<xs:element name="refpaisorigen" type="xs:string" minOccurs="0"/>
<xs:element name="variedadcolorcodigo" type="xs:string" minOccurs="0"/>
<xs:element name="variedadcoloragencia" type="xs:string" minOccurs="0"/>
<xs:element name="variedadcolor" type="xs:string" minOccurs="0"/>
<xs:element name="variedadtalleagencia" type="xs:string" minOccurs="0"/>
<xs:element name="variedadtallecodigo" type="xs:string" minOccurs="0"/>
<xs:element name="variedadtalle" type="xs:string" minOccurs="0"/>
<xs:element name="esunidadordenable" type="xs:boolean" minOccurs="0"/>
<xs:element name="cantminimapedir" type="xs:decimal" minOccurs="0"/>
<xs:element name="multiplopedir" type="xs:decimal" minOccurs="0"/>
<xs:element name="esfacturable" type="xs:boolean" minOccurs="0"/>
<xs:element name="esunidadembarque" type="xs:boolean" minOccurs="0"/>
<xs:element name="nrocapasartcomercial" type="xs:decimal" minOccurs="0"/>
<xs:element name="nroartcomercialesporcapa" type="xs:decimal" minOccurs="0"/>
<xs:element name="unidadesporpallet" type="xs:decimal" minOccurs="0"/>
<xs:element name="unidporcapa" type="xs:decimal" minOccurs="0"/>
<xs:element name="nrodecapas" type="xs:decimal" minOccurs="0"/>
<xs:element name="submarca" type="xs:string" minOccurs="0"/>
<xs:element name="variedadtipo" type="xs:string" minOccurs="0"/>
<xs:element name="oferta" type="xs:boolean" minOccurs="0"/>
<xs:element name="dscompania" type="xs:string" minOccurs="0"/>
<xs:element name="nombregen" type="xs:string" minOccurs="0"/>
<xs:element name="variedadsabor" type="xs:string" minOccurs="0"/>
<xs:element name="continentes" type="xs:string" minOccurs="0"/>
<xs:element name="reftiponivel" type="xs:string" minOccurs="0"/>
<xs:element name="esunidadconsumo" type="xs:boolean" minOccurs="0"/>
<xs:element name="pesoneto" type="xs:decimal" minOccurs="0"/>
<xs:element name="unidpesoneto" type="xs:string" minOccurs="0"/>
<xs:element name="cantidadtotalcontenida" type="xs:decimal" minOccurs="0"/>
<xs:element name="reftipogtin" type="xs:string" minOccurs="0"/>
<xs:element name="esprivado" type="xs:boolean" minOccurs="0"/>
<xs:element name="statussecodat" type="xs:string" minOccurs="0"/>
<xs:element name="accion" type="xs:int" minOccurs="0"/>
<xs:element name="fechaaccion" type="xs:int" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<NewDataSet xmlns="">
<Exportacion diffgr:id="Exportacion1" msdata:rowOrder="0">
<gtin>07500112045058</gtin>
<refidcateglobal>10005730</refidcateglobal>
<gln>7505000010064</gln>
<refpaismercado>484</refpaismercado>
<iniciovigenciadn>2012-08-09T00:00:00-05:00</iniciovigenciadn>
<finvigenciadn>4999-12-31T23:59:59-06:00</finvigenciadn>
<marca>PINTACOLOR</marca>
<descproducto>PINTACOLOR BLANCO</descproducto>
<descripcioncorta>PINTURA PINTACOLOR 18 L</descripcioncorta>
<profundo>40.000000000000000</profundo>
<unidprofundo>CM</unidprofundo>
<alto>60.000000000000000</alto>
<unidalto>CM</unidalto>
<ancho>40.000000000000000</ancho>
<unidancho>CM</unidancho>
<pesobruto>26.200000000000000</pesobruto>
<unidpesobruto>KG</unidpesobruto>
<unidpesoempaque>KG</unidpesoempaque>
<escontenidovariable>false</escontenidovariable>
<esretornable>false</esretornable>
<esunidadminima>true</esunidadminima>
<contenidos/>
<esunidadordenable>false</esunidadordenable>
<esfacturable>true</esfacturable>
<esunidadembarque>false</esunidadembarque>
<oferta>false</oferta>
<dscompania>DISTRIBUIDOR</dscompania>
<nombregen>PINTURA</nombregen>
<continentes/>
<reftiponivel>EA</reftiponivel>
<esunidadconsumo>false</esunidadconsumo>
<esprivado>false</esprivado>
<statussecodat>2</statussecodat>
</Exportacion>
</NewDataSet>
</diffgr:diffgram>
</DataSet>
So far I have been able to read the webservice, here is the code:
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Try
Dim SerSyncfonia As Syncfonia.Productos
SerSyncfonia = New Syncfonia.Productos()
Dim v1 = "7505000010064"
Dim v2 = "DISTRIBU"
Dim v3 = "DISTRIBU"
Dim v4 = ""
Dim v5 = "7500112045058"
Label1.Text = SerSyncfonia.ObtieneProducto(v1, v2, v3, v4, v5).ToString
Catch ex As Exception
Label1.Text = ex.Message.ToString
End Try
End Sub
The result I'm getting for Label1.Text after pressing Button1 is "System.Data.DataSet"
So, after I read the Web Service, how can I store this data somewhere to be able to work with data. For example, get the value of the nombregen element, or gtin element and store them somewhere.
In general, it's a bad idea to pass the DataSet class or any other type specific to .NET when using web services. That makes them only usable by compatible versions of .NET (not Java, for instance).
In your case, though, there's a simpler question: even if a DataSet was successfully passed, what exactly did you expect the ToString method to do? Even without web services, DataSet.ToString() isn't going to produce useful output.
I usually consume SOAP webservices with CFHTTP and post the XML as a HTTP parameter. However, this time I am trying to consume a webservice with createObject, but when I pass the XML as an argument to the webservice ws.someMethod(args);, it fails. I tried using a struct to hold the parameter values, but that also did not work. As such, how do one pass the parameters? The partial WSDL is below
<xs:element name="ORDER">
<xs:complexType>
<xs:sequence>
<xs:element name="Header" type="schemaOne:HeaderType"/>
<xs:element maxOccurs="unbounded" name="Detail" type="schemaOne:DetailType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="DetailType">
<xs:sequence>
<xs:element ref="schemaOne:DTORDN"/>
<xs:element ref="schemaOne:DTRCID"/>
<xs:element ref="schemaOne:DTPRT"/>
<xs:element ref="schemaOne:DTQTY"/>
<xs:element ref="schemaOne:DTNTU"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="HeaderType">
<xs:sequence>
<xs:element ref="schemaOne:DSORDN"/>
<xs:element ref="schemaOne:DSRCID"/>
<xs:element ref="schemaOne:DSBFNM"/>
<xs:element ref="schemaOne:DSBLNM"/>
<xs:element minOccurs="0" ref="schemaOne:DSBENT"/>
<xs:element ref="schemaOne:DSBAD1"/>
<xs:element minOccurs="0" ref="schemaOne:DSBAD2"/>
<xs:element minOccurs="0" ref="schemaOne:DSBAD3"/>
<xs:element ref="schemaOne:DSBAD4"/>
<xs:element ref="schemaOne:DSBSTT"/>
<xs:element ref="schemaOne:DSBZIP"/>
<xs:element ref="schemaOne:DSBCNT"/>
</xs:sequence>
</xs:complexType>
Here's the struct I've constructed.
<cfscript>
ORDER = {};
ORDER.Header = {};
ORDER.Detail = {};
ORDER.Header.DSORDN = '251716';
ORDER.Header.DSRCID = 'H';
ORDER.Header.DSBFNM = 'Joe';
ORDER.Header.DSBLNM = 'Smith';
ORDER.Header.DSBAD1 = '4997 County Road';
ORDER.Header.DSBAD4 = 'Springfield';
ORDER.Header.DSBSTT = 'MO';
ORDER.Header.DSBZIP = '49657';
ORDER.Header.DSBCNT = 'USA';
ORDER.Detail.DTORDN = '251716';
ORDER.Detail.DTRCID = 'D';
ORDER.Detail.DTPRT = '0300604';
ORDER.Detail.DTQTY = '0000000000001';
ORDER.Detail.DTNTU = '00000009.9900';
</cfscript>
i am working with unit tests at the moment and where trying to pass an xml file to my Webservice. I just saved the xml Files i needed inside external files and read them with "FileRead" inside cfscript. This is how i did it
<cfscript>
input = FileRead("http.....");
mycomponent = createObject("component", "component.beginning.from.root");
mycomponent.methodName(input);
</cfscript>
but i had to change my code because before i parsed the content of the HttpRequest to xml and where looking for the expected elements. Now i use the incoming file and look immediately for the elements i want instead of parsing because its already xml
<cfset var body = xmlsearch(arguments.input, "//soapenv:body")[1] />
if you're interested in the code of my webservice just look here
You have to consume SOAP web services that expect complex data type with CFC that mirrors the expected structure instead of passing the XML. See this
I'm using the following lines of code to call the web-service below:
def wsdl = 'http://somewhere.com/services/msgService?wsdl'
proxy = new WSClient(wsdl, this.class.classLoader)
proxy.initialize()
def msg = proxy.create("com.somwhere.test.api.MsgService")
msg.applicationName = "APP1"
msg.clientId = 5
msg.additionalProperties = [test:3]
for web-service
<xs:schema targetNamespace="http://somewhere.com/test/api/MsgService" version="1.0" xmlns:tns="http://somewhere.com/test/api/MsgService" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="sendMessage" type="tns:sendMessage"/>
<xs:complexType name="sendMessage">
<xs:sequence>
<xs:element minOccurs="0" name="mRequest" type="tns:mServiceRequest"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="mServiceRequest">
<xs:sequence>
<xs:element name="additionalProperties">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="entry">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="key" type="xs:string"/>
<xs:element minOccurs="0" name="value" type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="applicationName" type="xs:string"/>
<xs:element minOccurs="0" name="clientId" type="xs:long"/>
.......
</xs:sequence>
</xs:complexType>
</xs:schema>
But get the following error:
Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '{test=3}' with class 'java.util.LinkedHashMap' to class 'com.somwhere.test.api.MsgService$AdditionalProperties'
However, when the additionalProperties are an empty map, i.e. [:] it works fine.
What am I doing wrong? How must I format the map, or what other object do I need to use in order for it to work?
This is almost a year old... I hope you already found the answer somewhere else.
Just for the record I'll add what I think
The client should have generated a class with properties named key and value, just instantiate it with the normal create() and set said properties.
The field additionalProperties might be a simple list of said 'entries' or another class wrapping the list, in which case you have to create() it also.
The best thing to do is check the list of generated classes when generating the client, creating each one and dump()ing them to see the structure.
Be prepared to write something like this.
new groovyx.net.ws.WSClient(
"http://localhost/service?wsdl",
this.class.classLoader).with {
initialize()
def wrapper = create('defaultnamespace.MapWrapper')
wrapper.map = create('defaultnamespace.ArrayOfMapWrapperEntry')
wrapper.map.mapWrapperEntry = [key1:'value1',key2:'value2'].collect{k,v->
def entry = create('defaultnamespace.MapWrapperEntry')
entry.key = k
entry.value = v
entry
}
send wrapper
}
We decided to connect to another gateway that uses REST instead of wsdl since I didn't get it to work. I haven't tried jpertinos solution, but it looks promising.
However, I'm closing this ticket.