How to extract all the values within a segment in an XML file using JXPathContext getValue with the same tag name

159 views Asked by At

Below is a sample input xml file that I'm trying to parse. I'm able to get the value for most the elements except the 5th element from the REF segment where there are multiple comps. What's happening is, the value being extracted from that 5th element is from the last comp. I'd like to extract all three values. How do I do that? Thanks!! NOTE: I used println to just display the values but I am really using getValue.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<interchange protocol="X12" symbols="&gt;*.? ~">
  <segment name="S-ISA" no="1" tag="ISA">
    <elem>
      <comp>ISA</comp>
    </elem>
    <elem>
      <comp>00</comp>
    </elem>
    <elem>
      <comp>0000000000</comp>
    </elem>
    <elem>
      <comp>00</comp>
    </elem>
    <elem>
      <comp>0000000000</comp>
    </elem>
    <elem>
      <comp>ZZ</comp>
    </elem>
    <elem>
      <comp>GROUP      </comp>
    </elem>
    <elem>
      <comp>01</comp>
    </elem>
    <elem>
      <comp>&gt;</comp>
    </elem>
  </segment>
  <message release="" type="810" version="">
    <segment name="S-ST_1" no="3" tag="ST">
      <elem>
        <comp>ST</comp>
      </elem>
      <elem>
        <comp>010</comp>
      </elem>
    </segment>
    <segment name="S-REF_5" no="6" tag="REF">
      <elem>
        <comp>REF</comp>
      </elem>
      <elem>
        <comp>N</comp>
      </elem>
      <elem>
        <comp>123080</comp>
      </elem>
      <elem>
        <comp>FA</comp>
      </elem>
      <elem>
        <comp>DN</comp>
        <comp>78729512</comp>
        <comp>00000000</comp>
      </elem>
    </segment>
</interchange>

Below is is part of the code. The method that's failing/not returning the correct result is ReferenceIdentifier.

class IMPORT810InterchangeMapper extends InterchangeMapper{

    @Override
    JsonFormatWrapper mapInterchange(Interchange interchange)
    {
        JXPathContext context = this.setContext(interchange)

        IMPORT810JsonFormatWrapper Import810JsonFormatWrapper = new     IMPORT810JsonFormatWrapper()

        this.ImportInvoice(Import810JsonFormatWrapper)

        this.Header(Import810JsonFormatWrapper, context)

        if (context.getValue("messages/segments[@tag ='REF']")) {
            this.ReferenceIdentification(Import810JsonFormatWrapper, context)
        }

       Import810JsonFormatWrapper

    }


void Header(IMPORT810JsonFormatWrapper Import810JsonFormatWrapper, JXPathContext context)
{

        InterchangeHeader header = new InterchangeHeader()
        header.with {
            senderIdQualifier =  context.getValue("segments[@tag='ISA']/elem[6]/comp")
            senderId = context.getValue("segments[@tag='ISA']/elem[7]/comp")

        }

        Import810JsonFormatWrapper.importInvoice.interchangeHeader = header

    }


    void ReferenceIdentification(IMPORT810JsonFormatWrapper     Import810JsonFormatWrapper, JXPathContext context)
    {
        Import810JsonFormatWrapper.importInvoice.referenceIdentificationList =      new ArrayList<ReferenceIdentification>()

        Iterator referenceIdentificationListitr =     context.iterate("messages/segments[@tag ='REF']")

        referenceIdentificationListitr.each { group ->
            JXPathContext groupContext = JXPathContext.newContext(group)
            groupContext.setLenient(true)

            ReferenceIdentification referenceIdentification = new ReferenceIdentification()

            referenceIdentification.referenceIdentificationQualifier = groupContext.getValue("/elem[2]/comp")

            if (groupContext.getValue("/elem[4]/comp")) {

                referenceIdentification.referenceDescription = groupContext.getValue("/elem[4]/comp")
            }

            this.ReferenceIdentifier(referenceIdentification, groupContext)

  Import810JsonFormatWrapper.importInvoice.referenceIdentificationList.add(referenceIdentification)

        }
    }

   void ReferenceIdentifier(ReferenceIdentification referenceIdentification, JXPathContext groupContext) {

        ReferenceIdentifier referenceIdentifier = new ReferenceIdentifier()

        referenceIdentifier.referenceIdQual1 = groupContext.getValue("/elem[5]/comp[1]")
        System.out.println("referenceIdentifier.referenceIdQual1 " + referenceIdentifier.referenceIdQual1)

        referenceIdentifier.referenceId1 = groupContext.getValue("/elem[5]/comp[2]")
        System.out.println("referenceIdentifier.referenceId1 " + referenceIdentifier.referenceId1)

        referenceIdentifier.referenceIdQual2 = groupContext.getValue("/elem[5]/comp[3]")
        System.out.println("referenceIdentifier.referenceIdQual2 " + referenceIdentifier.referenceIdQual2)

referenceIdentification.referenceIdentifier = referenceIdentifier

    }

The expected result should be:

referenceIdentifier.referenceIdQual1 DN
referenceIdentifier.referenceId1 78729512
referenceIdentifier.referenceIdQual2 00000000

But the actual result is:

referenceIdentifier.referenceIdQual1 00000000
referenceIdentifier.referenceId1 null
referenceIdentifier.referenceIdQual2 null
0

There are 0 answers