如何用EdiFabric创建自定义信封解析带DXS/DXE的DEX 894/895文件
DEX(Direct Exchange)是电子数据交换(EDI)的一种形式,由直接门店配送(DSD)经销商用于在配送时向零售商电子发送配送信息、发票或贷项通知单。DEX是行业标准,任何具备DEX能力的供应商均可向具备DEX能力的零售商电子发送发票,无论双方使用何种DEX软件。DEX已存在多年,被所有大型杂货零售商及众多小型连锁和便利店使用。
在EdiFabric中解析带DXS/DXE信封的DEX格式X12 894/895
DEX使用自定义的DXS(起始信封)和DXE(结束信封)包裹标准X12 894/895消息,与常规X12的ISA/GS信封体系不同。以下是两种在EdiFabric中处理这类文件的方法:
方法一:预处理拆分信封(快速落地)
无需修改EdiFabric核心逻辑,先提取出中间的标准X12内容再解析:
- 读取完整的DEX传输文本,按换行分割成行
- 定位从
ST开头行到DXE开头行之前的所有内容,这部分就是标准X12消息 - 将提取出的内容拼接后,用EdiFabric的X12阅读器解析
示例代码(C#)
var dexRawContent = File.ReadAllText("dex_serial_input.txt"); var allLines = dexRawContent.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); var x12MessageLines = new List<string>(); bool captureX12 = false; foreach (var line in allLines) { if (line.StartsWith("ST*")) { captureX12 = true; x12MessageLines.Add(line); } else if (line.StartsWith("DXE*")) { captureX12 = false; break; } else if (captureX12) { x12MessageLines.Add(line); } } // 拼接成可直接解析的X12文本 var x12Content = string.Join(Environment.NewLine, x12MessageLines); // 解析894/895 using var x12Reader = new X12Reader(x12Content, new X12ReaderSettings { SkipTrailingSeparators = true }); while (x12Reader.Read()) { if (x12Reader.Message is EdiFabric.Core.Model.Edi.X12.M894 deliveryShipment) { // 处理配送装运(894)数据 var shipmentId = deliveryShipment.G82?.ShipmentIdentificationNumber; } else if (x12Reader.Message is EdiFabric.Core.Model.Edi.X12.M895 invoice) { // 处理发票(895)数据 } }
方法二:自定义信封规则(原生支持)
如果需要EdiFabric直接识别DXS/DXE信封,可自定义信封类并配置阅读器:
1. 创建DXS和DXE信封实体类
using EdiFabric.Core.Annotations.Edi; using EdiFabric.Core.Model.Edi; [EdiSegment, EdiPath("DXS")] public class DXS_Envelope : EdiSegment { [EdiValue("X(10)", Path = "DXS/0", Mandatory = true)] public string SenderId { get; set; } [EdiValue("X(2)", Path = "DXS/1", Mandatory = true)] public string TransactionTypeCode { get; set; } [EdiValue("X(10)", Path = "DXS/2", Mandatory = true)] public string VersionReleaseIdentifier { get; set; } [EdiValue("X(5)", Path = "DXS/3", Mandatory = true)] public string ReceiverId { get; set; } [EdiValue("X(10)", Path = "DXS/4", Mandatory = true)] public string SenderReferenceNumber { get; set; } [EdiValue("X(1)", Path = "DXS/5", Mandatory = false)] public string ProcessingIndicator { get; set; } } [EdiSegment, EdiPath("DXE")] public class DXE_Envelope : EdiSegment { [EdiValue("X(5)", Path = "DXE/0", Mandatory = true)] public string ReceiverId { get; set; } [EdiValue("X(1)", Path = "DXE/1", Mandatory = true)] public string TransactionCount { get; set; } }
2. 配置自定义阅读器
指定DXS为起始信封、DXE为结束信封,同时解析内部X12消息:
using EdiFabric.Framework.Readers; var readerSettings = new ReaderSettings(); // 添加自定义信封的起始/结束标识 readerSettings.EnvelopeStartSegments.Add("DXS"); readerSettings.EnvelopeEndSegments.Add("DXE"); using var customReader = new EdiReader("dex_transmission.txt", readerSettings); while (customReader.Read()) { // 读取DXS信封 if (customReader.Segment is DXS_Envelope dxs) { var senderId = dxs.SenderId; var version = dxs.VersionReleaseIdentifier; } // 读取X12 894消息 else if (customReader.Message is EdiFabric.Core.Model.Edi.X12.M894 m894) { // 处理894数据 } // 读取X12 895消息 else if (customReader.Message is EdiFabric.Core.Model.Edi.X12.M895 m895) { // 处理895数据 } // 读取DXE信封 else if (customReader.Segment is DXE_Envelope dxe) { var transactionCount = dxe.TransactionCount; // 可校验内部消息数量是否与DXE中的计数一致 } }
关键注意事项
- DEX使用的X12版本多为
005010UCS,确保EdiFabric解析器配置对应版本 - 串口传入的DEX数据流需先解码为文本(如ASCII编码)再处理
- 若DXE包含事务计数,建议验证其与实际解析出的X12消息数量是否匹配
内容的提问来源于stack exchange,提问作者dirq
相关产品推荐
相关产品推荐

