Я пытаюсь создать общий синтаксический анализатор EDI, который может обрабатывать, когда какие-либо ситуационные сегменты отсутствуют в данном файле. Это было достаточно просто, используя атрибут minOccurs="0"
в XML-сопоставлении, однако я изо всех сил пытаюсь понять, как справиться с этим, когда несколько сегментов повторяются с одним и тем же тегом. Например:
CAS*PR*1*793~
NM1*QC*1*SHEPHARD*SAM*O***HN*666666666A~ --PatientName
NM1*IL*1*SHEPARD*JESSICA****HN*999887777A~ --InsuredName
MIA*0***138018.4~
Сопоставлено с использованием следующего XML:
<medi:segment segcode="NM1" xmltag="PatientNameSegment" minOccurs="0" truncatable="true">
<medi:field xmltag="EntityIdentifierCode" />
<medi:field xmltag="EntityTypeQualifier" />
<medi:field xmltag="LastName" />
<medi:field xmltag="FirstName" />
<medi:field xmltag="MiddleName" />
<medi:field xmltag="NamePrefix" />
<medi:field xmltag="NameSuffix" />
<medi:field xmltag="IdentificationCodeQualifer" />
<medi:field xmltag="IdentificationCode" />
</medi:segment>
<medi:segment segcode="NM1" xmltag="InsuredNameSegment" minOccurs="0" truncatable="true">
<medi:field xmltag="EntityIdentifierCode" />
<medi:field xmltag="EntityTypeQualifier" />
<medi:field xmltag="LastName" />
<medi:field xmltag="FirstName" />
<medi:field xmltag="MiddleName" />
<medi:field xmltag="NamePrefix" />
<medi:field xmltag="NameSuffix" />
<medi:field xmltag="IdentificationCodeQualifer" />
<medi:field xmltag="IdentificationCode" />
</medi:segment>
Но когда первая строка для имени пациента удалена из входного файла, она просто загрузит застрахованное имя в имя пациента и пропустит загрузку застрахованного имени, а не оставит имя пациента пустым.
По сути, то, что я хотел бы, эквивалентно указанию «NM1 * QC» в качестве segcode (поскольку на самом деле его установка убивает синтаксический анализатор). Я вижу, что документация Smooks также допускает сопоставление регулярных выражений, но я не уверен, с чем его сравнивают, и мне еще не удалось поэкспериментировать с ним.
Спасибо!