在你叹息并握住你的头之前,请理解我在一个相当紧迫的时间线上使用一个非常古老的系统。
我们有一个用业务语言编写的单通道EDI解析器。目前,包括每个段的循环级别,区域和名称的数据定义存储在数据库表中。该表还为区域内的每个段分配增量序列号。例如,004010 810标题区:
等。等
因此,如果按照它们在标准中出现的顺序读取片段,我们可以说每个片段都可以分配一个序号,一个"深度" (有多少循环"向下"它出现)和一个名称(2-3个字符)。
目前解析器遵循的算法如下:
Reset currentArea to 1
For each segment in the document
{
Search for the segment's name in the table restricting the area >= currentArea.
If not found, we have an error.
else
{
If the area changed
{
empty the temporary "search bounds" table. Create a single record with upper bound equal to MAX(sequence in current area) and lower bound equal to MIN(sequence in current area).
}
If the area did not change
{
Search for the next segment with a matching, but only within the bounds of the last "bounds" record created.
If the segment is found and the loop level changed as a result
{
Create a new bounds record with lower bound = MIN(sequence in current loop) and upper bound = MAX(sequence in current loop).
}
If the segment is not found within the searched bounds
{
"Pop" a bounds record out of the table to widen the search, repeat recursively until a segment having the same name is found.
}
}
}
}
不幸的是,我不确定我是否有时间或方法使用实际的文档架构来实现基于XML的解决方案。我目前正在研究几种这样的解析器,他们似乎能够根据模式神奇地安排EDI,无论它看起来如何。
我面临的问题是:
在945文档中,详细信息区域如下所示(摘录):
<DETAIL>
<LX>
<MAN>
<PAL>
<N9>
<W12 (loop header)>
<G69>
...
<miscellaneous other segments>
...
<LS>
<LX (loop header)>
...
<miscellaneous other segments in LX loop>
...
<LE>
...
</DETAIL>
在我的原始数据中,我们有:
LX * 1〜 MAN * GM * 0000803225000421444452〜 N9 * 2I * 12150-1〜 W12 * CC * 2 * 2 * 0 * * EA * 101199007289 VN * 10007〜 N9 *李* 1〜 LX * 5〜 MAN * GM * 0000803225000421444453〜 N9 * 2I * 12150-2〜 ......(其他部分)
基于上面的算法,当第二个LX段被击中时,当前存在一个&#34;循环边界&#34;记录从W12(W12)的第一段到W12(FA.FA2)内的最后一段。因此,当在文档的标准表上执行搜索时,在定义中找到的下一个LX是打开它的&#39;在W12中拥有自己的循环。这是错误的 - 细节区域实际上是在这里重置,LX实际上是区域中的第一个段,而不是W12.LX循环的开始。由于解析器的天真特性,它无法区分这一点,因为它是基于循环的标准表上的自下而上搜索。
更改解析器以查看区域的开头(自上而下)而不是当前模型会产生相反的问题。如果贸易伙伴实际上打算打开内部W12.LX循环,解析器会将其解释为新细节区域的开头。
使用我所描述的表格中定义的标准单通道解析器是否可以解决这种情况?是否找到某种方法将XML解决方案破解到我们相当旧的系统中这是唯一的方法?由于EDI没有&#34;结束标记&#34;,我可以确定循环实际结束的唯一方法是&#34;展望未来&#34;在文档中找不到的情况,比如内部W12.LX之后出现的MAN段(因为详细区域必须重置,以便再次使用MAN段)。
我在绳子的尽头,欢迎任何想法。
答案 0 :(得分:0)
是的,这可以在单通道解析器中完成(我这样做了)
如您所示,表中应指出正确的循环水平
你要跟踪你在桌子上的位置
阅读一个新细分,在表格中查看
从已读取的表中的最后一个段开始查找
表中的查找有点复杂:
1.新记录可以在同一循环级中
2.可以重复相同的循环
3.循环可能已经结束,您需要在消息中进一步查看
如果没有找到,请给出错误
如果找到,请转到传入文件中的新段等。
如果段/循环是强制的或有条件的,那么AFAIK必须具有绝对表 - 如果您想要一个可以解析所有消息/事务类型的通用工具。
实际上你遇到的问题是LS / LE循环。第二个LX环路嵌入在LS / LE段中。发明LS / LE是为了解决“碰撞”问题。如果在LS循环中,它应该以LE段终止。