Scenario I'm trying to upload the multipart file which has xml content, the xml data will be parse one by one and stored in the database.
Sample XML Data
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Table>
<Copyright>
<applicationno>1641/2001</applicationno>
<applicationdate>11/15/2001 12:00:00 AM</applicationdate>
<TitleEnglish>DURA PLUS</TitleEnglish>
<applicantname>FARMIGEA PAKISTAN (PVT) LTD.</applicantname>
<class>ARTISTIC WORK</class>
<City>LAHORE</City>
<Country>PAKISTAN</Country>
<status>Application Registered</status>
</Copyright>
<Copyright>
<applicationno>1644/2001</applicationno>
<applicationdate>11/15/2001 12:00:00 AM</applicationdate>
<TitleEnglish>OCUGEL FARMIGEA</TitleEnglish>
<applicantname>FARMIGEA PAKISTAN (PVT) LTD.</applicantname>
<class>ARTISTIC WORK</class>
<City>LAHORE</City>
<Country>PAKISTAN</Country>
<status>Application Registered</status>
</Copyright>
<Table>
API
<?xml version="1.0" encoding="UTF-8"?>
<api context="/ipo" name="IPOSearch" xmlns="http://ws.apache.org/ns/synapse">
<resource methods="POST" uri-template="/send">
<inSequence>
<property name="messageType" scope="axis2" type="STRING" value="multipart/form-data"/>
<property expression="//mediate/ipo" name="Table" scope="default" type="STRING"/>
<property expression="base64Decode(get-property('Table'))" name="DecodeTable" scope="default" type="STRING"/>
<payloadFactory media-type="xml">
<format>
<root>$1</root>
</format>
<args>
<arg evaluator="xml" expression="get-property('DecodeTable')"/>
</args>
</payloadFactory>
<foreach expression="//Table/Copyright" id="foreach_copyright">
<sequence>
<dbreport>
<connection>
<pool>
<driver>org.postgresql.Driver</driver>
<url>jdbc:postgresql://XXXXXX:5432/secpleapdev?currentSchema=secpleap</url>
<user>postgres</user>
<password>root</password>
</pool>
</connection>
<statement>
<sql><![CDATA[INSERT INTO secpleap.ipo_copyright
(application_no, application_date, title_english, applicant_name, class_name, city, country, status)
VALUES(?, ?, ?, ?, ?, ?, ?, ?);
]]></sql>
<parameter expression="//applicationno" type="VARCHAR" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"/>
<parameter expression="//applicationdate" type="VARCHAR" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"/>
<parameter expression="//TitleEnglish" type="VARCHAR" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"/>
<parameter expression="//applicantname" type="VARCHAR" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"/>
<parameter expression="//class" type="VARCHAR" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"/>
<parameter expression="//City" type="VARCHAR" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"/>
<parameter expression="//Country" type="VARCHAR" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"/>
<parameter expression="//status" type="VARCHAR"/>
</statement>
</dbreport>
</sequence>
</foreach>
</inSequence>
<outSequence>
<log level="custom">
<property name="add" value="Records added!!!!"/>
</log>
<payloadFactory media-type="json">
<format>{
"status" : "Records added",

}</format>
<args/>
</payloadFactory>
<respond/>
</outSequence>
<faultSequence>
<payloadFactory media-type="json">
<format>
{
"status" : "Failure",
"records" : "0"
}</format>
<args/>
</payloadFactory>
<respond/>
</faultSequence>
</resource>
</api>
Error
[2022-12-28 18:39:52,890] ERROR {SequenceMediator} - {api:IPOSearch} com.ctc.wstx.exc.WstxParsingException: Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs.
at [row,col {unknown-source}]: [1,62] org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxParsingException: Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs.
at [row,col {unknown-source}]: [1,62]
at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)
at org.apache.axiom.om.impl.llom.OMSerializableImpl.build(OMSerializableImpl.java:78)
at org.apache.axiom.om.impl.llom.OMElementImpl.build(OMElementImpl.java:722)
at org.apache.axiom.om.impl.llom.OMElementImpl.detach(OMElementImpl.java:700)
at org.apache.axiom.om.impl.llom.OMNodeImpl.setParent(OMNodeImpl.java:105)
at org.apache.axiom.om.impl.llom.OMElementImpl.addChild(OMElementImpl.java:296)
at org.apache.axiom.om.impl.llom.OMElementImpl.addChild(OMElementImpl.java:212)
at org.apache.axiom.soap.impl.llom.SOAPBodyImpl.addChild(SOAPBodyImpl.java:231)
at org.apache.synapse.mediators.transform.PayloadFactoryMediator.mediate(PayloadFactoryMediator.java:132)
at org.apache.synapse.mediators.transform.PayloadFactoryMediator.mediate(PayloadFactoryMediator.java:111)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:110)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:72)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
at org.apache.synapse.api.Resource.process(Resource.java:342)
at org.apache.synapse.api.API.process(API.java:477)
at org.apache.synapse.api.AbstractApiHandler.apiProcess(AbstractApiHandler.java:93)
at org.apache.synapse.api.AbstractApiHandler.dispatchToAPI(AbstractApiHandler.java:71)
at org.apache.synapse.api.rest.RestRequestHandler.dispatchToAPI(RestRequestHandler.java:90)
at org.apache.synapse.api.rest.RestRequestHandler.process(RestRequestHandler.java:76)
at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:54)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:344)
at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:101)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:376)
at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:435)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:183)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: com.ctc.wstx.exc.WstxParsingException: Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs.
at [row,col {unknown-source}]: [1,62]
at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606)
at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:479)
at com.ctc.wstx.sr.BasicStreamReader.readPIPrimary(BasicStreamReader.java:3940)
at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2816)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1072)
at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:681)
at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214)
... 29 more
Question
payload
, its giving me the error which is mentioned
above. Any resolution to that?payload factory
before foreach
mediator, how could I use DecodeTable
property values as expression
of foreach
mediator?The issue is you are trying to include the XML Declaration(<?xml version="1.0" encoding="utf-8" standalone="yes"?>
) in the Payload which is incorrect.
Inorder to resolve the issue, instead of a type="STRING"
property try using an type="OM"
property. Then the XML will be parsed correctly and you will have an XML node tree that you can easily traverse. Then use that in your Payloadfactory.
<property expression="base64Decode(get-property('Table'))" name="DecodeTable" scope="default" type="OM"/>