Search code examples
wso2wso2-enterprise-integrator

Error: com.ctc.wstx.exc.WstxParsingException: Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs


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>{&#xd;
    "status" : "Records added",&#xd;
    &#xd;
}</format>
                <args/>
            </payloadFactory>
            <respond/>
        </outSequence>
        <faultSequence>
            <payloadFactory media-type="json">
                <format>&#xd;
{&#xd;
    "status" : "Failure",&#xd;
    "records" : "0"&#xd;
}</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

  1. I've converted base64 encoded data but before looping when I'm generating a new payload, its giving me the error which is mentioned above. Any resolution to that?
  2. If lets say I don't use payload factory before foreach mediator, how could I use DecodeTable property values as expression of foreach mediator?

Solution

  • 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"/>