解析 EDIFACT 实际上并没有那么复杂。只需在语法字符处拆分:首先在' 获取段,然后在+ 获取该段的数据元素,然后在: 获取各个组件。当然,您需要处理转义的分隔符。这里使用的字符只是默认值,它们可以在消息的开头通过可选的 UNA 段进行更改。实际上,EDIFACT 上的wikipedia article 对此进行了很好的(但简短的)介绍。格式在UN's UNECE site 上有详细记录(是的,这很多而且难以阅读)。
棘手的部分是从中获取信息并进入您的应用程序(并验证它是否有效,更不用说创建好的错误消息了)。如果你真的打算用任何语言从无到有地编写一个完整的解析器,那么:不,没有简单的方法可以做到这一点。也没有任何其他灵活的数据表示。这是一项艰巨的任务,而且永远都是。
但这里有一个想法:如果您对 XML 有这么多的兴趣(或者您喜欢称之为的任何其他“现代技术”......)。编写一些将 EDIFACT 消息转换为某种统一的 XML-EDIFACT-Format 的程序将是一项相对容易的任务(这是一件非常可怕的事情,很可能会吓到我)。您可以将每个 EDIFACT 段转换为一个 XML 标记,可能是这样的:
ERC+A7V:1:AMD'
IFT+3+NO MORE FLIGHTS'
在 XML 中:
<segment qualifier="ERC">
<element>
<component>A7V</component>
<component>1</component>
<component>AMD<component>
</element>
</segment>
<segment qualifier="IFT">
<element>
<component>3</component>
</element>
<element>
<component>NO MORE FLIGHTS</component>
</element>
</segment>
然后您就可以释放您的 XML 工具和库的力量来验证/评估它。
你也可以做的更具体,像这样:
<segment_ERC>
<element>
<component>A7V</component>
<component>1</component>
<component>AMD<component>
</element>
</segment_ERC>
<segment_IFT>
<element>
<component>3</component>
</element>
<element>
<component>NO MORE FLIGHTS</component>
</element>
</segment_IFT>
这可以使通过 XSD 的验证更容易。当然,您可以通过此对话获得尽可能具体的信息,但是您迟早会遇到一个问题,即您需要将有关当前解析的消息结构的信息放入转换器中(因为这并非易事知道哪些段嵌套在对它们进行分组的其他段中。不仅有UNG、UNH 等,还有一些你不直接看到的段组。
不过,根据您应该作为文档获得的 EDIFACT 手册,您必须为收到的消息创建特定的评估程序/模式/任何内容。