Как определить ISA-сегмент в смуках?

Я создаю сообщения ANSI.X12 в java-программе с помощью smooks. Я сам определяю сообщения X12 с помощью xml-файлов (с их http://www.milyn.org/schema/edi-message-mapping-1.2.xsd). Большинство из них работает достаточно хорошо, но у меня есть проблема с ISA-сегментом. Я определил это как таковое:

<?xml version="1.0" encoding="UTF-8"?>
<medi:edimap xmlns:medi="http://www.milyn.org/schema/edi-message-mapping-1.2.xsd">

    <medi:description name="Some X12 Message Definition" version="1.0" />

    <medi:delimiters segment="&#10;" field="*" 
        component="^" sub-component="~" escape="?" />

    <medi:segments xmltag="Segments">

        <medi:segment segcode="ISA" xmltag="InterchangeControlHeader">
            <medi:field xmltag="AuthorizationInformationQualifier" />
            <medi:field xmltag="AuthorizationInformation"/>
            <medi:field xmltag="SecurityInformationQualifier"/>
            <medi:field xmltag="SecurityInformation"/>
            <medi:field xmltag="InterchangeSenderQualifier"/>
            <medi:field xmltag="InterchangeSenderID"/>
            <medi:field xmltag="InterchangeReceiverQualifier"/>
            <medi:field xmltag="InterchangeReceiverID"/>
            <medi:field xmltag="InterchangeDate" type="Date" typeParameters="format=yyMMdd"/>
            <medi:field xmltag="InterchangeTime" type="Date" typeParameters="format=HHmm"/>
            <medi:field xmltag="InterchangeControlStandardsIdentifier"/>
            <medi:field xmltag="InterchangeControlVersionNumber"/>
            <medi:field xmltag="InterchangeControlNumber"/>
            <medi:field xmltag="AcknowledgmentRequested"/>
            <medi:field xmltag="UsageIndicator"/>
            <medi:field xmltag="ComponentElementSeparator"/>
        </medi:segment>
[...]

Пока я вставляю строки правильной длины, в основном это можно использовать. Проблема связана с разделителем компонентов (в данном случае ^). Сегмент ISA определяет, какие символы являются специальными символами, используемыми для разделения сегментов, элементов и т. Д. Когда я помещаю "^" в качестве значения в ComponentElementSeparator, он становится экранированным (конечно), поскольку это специальный символ, и smooks не знает, что мой ISA сегмент - это особый сегмент ISA.

я получил

ISA*00*          *00*          *01*000000987654321*01*000000123456789*141031*1656*U*00401*000002388*0*T*?^

где это должно быть

ISA*00*          *00*          *01*000000987654321*01*000000123456789*141031*1656*U*00401*000002388*0*T*^

(обратите внимание на ? в конце перед ^).

Единственный обходной путь, который я нашел до сих пор, - это поместить в medi:delimiters какой-нибудь другой символ, например <medi:delimiters segment="&#10;" field="*" component="&lt;" sub-component="~" escape="?" />, но это обязательно создаст проблемы, как только этот символ появится где-то в данных. Это особенно расстраивает, поскольку в сообщении даже не используются какие-либо компоненты, которые необходимо разделить.

Я не смог найти никакой информации об этом в документации smooks, но должен быть какой-то способ как-то это сделать. В конце концов, X12 - это одна из двух известных мне причин, по которым кто-либо будет использовать smooks в первую очередь (другая - EDIFACT).

Кто-нибудь знает, как правильно вставить ISA в мое описание сообщения smooks?


person kratenko    schedule 07.11.2014    source источник
comment
Просто предположение, но разве может быть, что тег <delimiters> - это все, что вам нужно указать. Я предполагаю, что тег delimiters создает для вас сегмент ISA, без необходимости явно указывать его самостоятельно?   -  person geert3    schedule 04.12.2014
comment
@ geert3 Да, это вся необходимая информация. Но я должен заполнить информацию для этого сегмента (например, 000000987654321 в примере) или как сделать так, чтобы этот сегмент отображался в созданном сообщении.   -  person kratenko    schedule 04.12.2014
comment
Что произойдет, если вы оставите там ?. Я вижу много примеров, когда перед концом первого компонента есть какой-то выход. Кроме того, ISA - это сегмент фиксированной длины, и кажется, что последний символ взят, независимо (я думаю), экранирован он или нет. Итак, что произойдет, если вы оставите это там, просто убедитесь, что общая длина в порядке.   -  person geert3    schedule 04.12.2014
comment
@kratenko: если все сегменты в одну строку, как вы читаете неформатированный EDI-файл? Ваша конфигурация разделителя будет считываться, только если сегменты EDI отформатированы. Вы форматируете сегменты EDI перед синтаксическим анализом?   -  person JToddler    schedule 02.03.2016
comment
@JToddler Не уверен, что вы имеете в виду под неформатированным файлом EDI, X12 всегда отформатированы, в этом вся суть. Если вы имеете в виду, как найти разделители: ISA имеет фиксированную ширину полей, поэтому вы можете прочитать разделители в определенных байтовых позициях перед анализом остальной части файла. Если бы я не понял, что вы имеете в виду, я был бы рад встретиться с вами в чате.   -  person kratenko    schedule 03.03.2016
comment
@JToddler в чате вы можете найти меня здесь: chat.stackoverflow.com/rooms/105197/edi   -  person kratenko    schedule 03.03.2016
comment
@kratenko спасибо. я разместил свой вопрос здесь stackoverflow.com/questions/35780645/unable-to-read-edi-file   -  person JToddler    schedule 03.03.2016


Ответы (1)


Это может быть поздно, но я столкнулся с проблемой. Я определил, что проблема (если вы используете EJC для генерации) заключается в том, что он добавляет следующее в конце каждого шага вывода сегмента:

writer.write(EDIUtils.concatAndTruncate(nodeTokens, DelimiterType.FIELD, delimiters));

Если разделитель является последним (которым является ISA.ComponentElementSeparator), он будет усечен , если не определен с escape-символом, что не является желаемым поведением для этого конкретного сценария. Пока нет ответа, но хотел указать источник проблемы.

Здесь добавлено определение проблемы и возможное направление: https://github.com/smooks/smooks/issues/114

ОБНОВЛЕНИЕ: при использовании EJC установите следующее:

 <medi:import truncatableSegments="false" ....
person dhartford    schedule 28.03.2016