如何使用具有相同标记名称的JXPathContext getValue提取XML文件中的段内的所有值

时间:2017-12-07 17:47:53

标签: xml jxpath

以下是我尝试解析的输入xml文件示例。我能够获得大多数元素的值,除了来自REF段的第5个元素,其中有多个comps。发生了什么,从第5个元素中提取的值来自最后一个comp。我想提取所有三个值。我怎么做?谢谢!!注意:我使用println只显示值,但我实际上使用的是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>

以下是代码的一部分。失败/未返回正确结果的方法是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

    }

预期结果应为:

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

但实际结果是:

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

0 个答案:

没有答案