EDI电子数据交换,是对国际贸易中的采购订单、装箱单、提货单等数据的交换,定义的一种国际标准。有X12、EDIFACT、TRADACOMS及ebXML等多种报文格式,支持AS2、OFTP、SFTP、FTP等传输协议。
X12报文结构,参照百度文库:https://wenku.baidu.com/view/4dd847d2240c844769eaeeba.html
X12为例报文层次如下:

完整的856报文示例,以缩进表明层次关系

可以使用一款开源的插件,来实现X12报文生成、转换,下载地址为:
https://github.com/Inteligenz/X12Parser
此插件,用xml文件定义了各种单据的格式。
以下代码以上边第二张图片的856范本为例,856详解,请参照百度文库:https://wenku.baidu.com/view/4dd847d2240c844769eaeeba.html
先定义interchange ,交换报文,即ISA
Interchange interchange = new Interchange(DateTime.Now, 1, true, '~', '*', '>');
interchange.InterchangeSenderId = "taisingTest";
interchange.InterchangeReceiverId = "157269697";
interchange.SetElement(14, "0");
在interchange 下定义FunctionGroup,即GS
FunctionGroup functionGroup= interchange.AddFunctionGroup("SH", DateTime.Now, 1);
functionGroup.ApplicationSendersCode = "taisingTest";
functionGroup.ApplicationReceiversCode = "157269697";
functionGroup.SetElement(4, DateTime.Now.ToString("yyMMdd"));
在functionGroup下定义Transaction,即ST
Transaction transaction= functionGroup.AddTransaction("856", "0001");
Segment bsn= transaction.AddSegment("BSN");
bsn.SetElement(1, "00"); //2/2
bsn.SetElement(2, "00000"); //Shipper's Ship Notice Identification 2/10
bsn.SetElement(3, DateTime.Now.ToString("yyyyMMdd")); //Date
bsn.SetElement(4, DateTime.Now.ToString("HHMM"));
在transaction下定义Segment,如PEF、TD、REF、HL等
var seg = transaction.AddSegment(new TypedSegmentDTM());
seg.DTM01_DateTimeQualifier=DTPQualifier.Shipped; //Shipped=011
seg.DTM02_Date= DateTime.Now.ToString("yyyyMMdd"); //Ship Date
var h1= transaction.AddHLoop("1","S",false); //HL1
var prf=h1.AddSegment("PRF");
prf.SetElement(1, "PO18001");
prf.SetElement(4, "20180823");
h1.AddSegment("TD1*BOX*2~");
h1.AddSegment("TD5*B*2*01*A~");
将实例interchange格式化成X12报文字符串
string result=interchange.SerializeToX12(true)
生成EDI文件
File.WriteAllText("test.edi", result);




