Forum Discussion

mohamadelmardin's avatar
mohamadelmardin
New Contributor III
8 years ago

Parsing XML Array to JSON array is inconsistent

When using XML parser snap to parse XML documents we are facing a problem when handling XML array type. This is because XML parser parses XML Array at runtime to either a JSON array if the particular element in the incoming XML message comes as array or as a single JSON object/element if the particular element in the incoming XML message comes as a single element not as an array. This is causing a major problem down the processing pipeline especially when using Mapper or any similar snaps where the parsed JSON data comes either as an array or as element {} and pipeline breaks for error.

The question is how can we force XML parser or combine it with any other technique so that it will parse XML element to JSON always as an array even if it comes as a single XML array element. Attached is an example of a simple pipeline reading an xml file with attached schema xsd. If the XML item element cames as an array then the pipeline will process successfully til the tend but if it comes as a single item then it will definitely fails at Mapper because JSON cannot treat it as an array
ParsingXMLArray_2017_07_24.slp (4.5 KB)
shippingtestingschema.xsd.txt (1.2 KB)
shiporder.xml.txt (673 Bytes)
shiporder_OneItem.xml.txt (527 Bytes)

8 Replies

  • del's avatar
    del
    Contributor III

    Specifically for your example pipeline, try adding a new Mapper with the following configuration immediately after your XML Parser:

    (note the Pass through selection)

    • mohamadelmardin's avatar
      mohamadelmardin
      New Contributor III

      Thank you @del . This solution resolved my issue.
      So let me put it differently now. Aside from my specific example and assuming that I have just to parse from XML to JSON and write it as-is without using any mapping/transformation to a JSON file to an external system but with the array format always enforced even with one element, Is there a way to do it in the XML parser by let us say for example checking the validate against XSD schema? Or do I have to use a mapper always to clean it and enforce the array on it?

      The reason I am asking again because the XML I gave was just a simple example but in my real scenario the XML payload I am working in has more than a 100 elements and multiple nested array structure. so that means I have to use a mapper for each expected array in order to check it and use the [].concat[element] on it ?!

      • nshruthi's avatar
        nshruthi
        New Contributor II

        Hi,

        Am also looking for solution for similar kind of issue with multiple elements having array structure, Did you find any solution in xml parser or added multiple mappers?

        TIA,
        Shruthi

  • debasish's avatar
    debasish
    New Contributor

    Use XML schema validation in XML parser with schema file provided.
    In the XSD schema lets have the child elements defined with minOccurs=“0” as explicitly defined .
    This will help you solve all the issues at all places.

    “E1EXCHANGE_RATE”: {
    @SEGMENT”: “1”,
    “LOG_SYSTEM”: “XXXXXXXX”,
    “DEV_ALLOW”: “000”,
    “E1ABCDEF_0”: [
    {
    @SEGMENT”: “1”,
    “RATE_TYPE”: “200*”
    }
    ]
    },

    XSD:
    <xs:element name=“E1ABCDEF_0” maxOccurs=“unbounded” minOccurs=“0”>
    xs:complexType
    xs:sequence
    <xs:element type=“xs:string” name=“RATE_TYPE” minOccurs=“0”/>