xml报文解析_STIHL EDIFACT DELFOR 解析过程

在《STIHL EDI需求分析》一文中,着重分析了STIHL的需求,比如要求AS2传输,EDIFACT标准,涉及五种不同类型的业务文件。同时基于知行EDI平台,建立EDI工作流,解析与生成EDIFACT标准文件,同时实现和ERP系统集成。接下来介绍STIHL与供应商 DELFOR(交货计划)的业务需求和实现场景,以及解决方案的实现过程。

采购商接收由STIHL发送给供应商的DELFOR 报文,在STIHL EDI解决方案中提到,接收方向的工作流如下:

dc49f93e23792f74b8aa43ad84a54a55.png

下面以自定义XML解决方案为例,演示DELFOR的解析步骤。

报文转换

将从STIHL收到的EDIFACT标准的DELFOR 转换为自定义XML,主要分为以下步骤:

  1. EDIFACT标准的DELFOR报文

Delivery schedule – DELFOR

下文摘出EDIFACT标准报文的核心部分,附上文字说明,先了解DELFOR会携带的核心业务信息。

BGM+241+DELFOR0000001+5+AB'
-241 = Delivery schedule
-交货计划编号:DELFOR0000001
-5 = Replaces previous delivery schedule
 
DTM+137:20151110:102'
-137 = Document/message date/time
-交货计划日期:20151110
 
DTM+157:20151110:102'
-157 = Validity start date
-有效起始日期:20151110
 
NAD+SE+Seller code::92++Seller Name+Seller address++postcode+country code'
-SE = Seller
-销售方编号:Seller code
-销售方姓名:Seller Name
-销售方地址:Seller address
-邮编:postcode
-国家代码:country code
 
NAD+BY+Buyer code::91++Buyer Name+Buyer Address++postcode+country code'
-BY = Buyer
-采购方编号:Buyer code
-采购方姓名:Buyer Name
-采购方地址:Buyer address
-邮编:postcode
-国家代码:country code
 
GIS+95'
-Header/detailed section separation
 
LIN+1++1234567:BP::92'
-BP =  Buyer’s item/article number
-采购方物料编号:1234567
 
IMD+++::92:description'
-物料描述:description
 
FTX+COI+++Purchase order text'
-采购订单备注:Purchase order text
 
RFF+CO:order number:00001'
-采购订单编号:order number
-采购订单行号:000001
 
RFF+AAN:2'
-新预测编号:2
 
DTM+171:20151110:102'
-171 = Reference date/time
-新预测日期:20151110
 
RFF+SH:1'
-旧预测编号:1
 
DTM+171:20151103:102'
-171 = Reference date/time
-旧预测日期:20151110
 
NAD+CN+01::92++Delivery name+Delivery address+++postcode+country code'
-BY = Delivery
-收货方仓库:01
-收货方姓名:Delivery Name
-收货方地址:Delivery address
-邮编:postcode
-国家代码:country code
 
CTA+IC+key:name'
-IC = MRP controller
-物料管理员编号:key
-物料管理员姓名:name
 
COM++tel-number:TE'
-TE = Telephone number
-电话号码:tel-number
 
COM++fax-number:FX'
-FX = Fax number
-电话号码:fax-number
 
QTY+48:576:PCE'
-48 = Received quantity
-上一次接收数量:576
 
DTM+50:20151013:102'
-50 = Date of most recent delivery
-上次收货时间:20151013
 
RFF+DQ:DN0000001'
-DQ = last delivery note number
-上次发货通知编号:DN0000001
 
QTY+70:2880:PCE'
-70 = Input cumulative quantity
-累计接收数量:2880
 
DTM+51:20150101:102'
-51 = data cumulative quantity last reset
-累计开始时间:20150101
 
SCC+3'
-3 = Material procurement release
 
QTY+113:576:PCE'
-113 = Quantity to be delivered
-需求数量:576
-数量单位:PCE
 
DTM+2:20160121:102'
-2 = Delivery date/time, requested
-需求日期:20160121
 
SCC+4'
-4 = Preview without go-ahead
 
QTY+113:576:PCE'
-113 = Quantity to be delivered
-需求数量:576
-数量单位:PCE
 
DTM+2:20160211:102'
-2 = Delivery date/time, requested
-需求日期:20160121
 
QTY+113:576:PCE'
-113 = Quantity to be delivered
-需求数量:576
-数量单位:PCE
 
DTM+64:20170101:102'
-64 = start of needs period
-开始日期:20170101
 
DTM+63:20170131:102'
-63 = End of needs period
-结束日期:20170131
 
QTY+113:576:PCE'
-113 = Quantity to be delivered
-需求数量:576
-数量单位:PCE
 
DTM+64:20170301:102'
-64 = start of needs period
-开始日期:20170101
 
DTM+63:20170331:102'
-63 = End of needs period
-结束日期:20170131
  1. 使用EDIFACT端口,将DELFOR报文转化为EDI系统标准XML,以Delivery Schedule为例,结果如下:

相对原始EDIFACT DELFOR来说,以下标准XML格式对技术工程师来说,更易处理,但XML结构略复杂一些,同时有许多冗余信息,将在下一步作XML简化。

<TransactionSet>
 <TX-D99B-DELFOR type="TransactionSet">
 <Meta>
 <!--Message reference number-->
 <_0062>0</_0062>
 <!--MESSAGE IDENTIFIER-->
 <S009 type="Composite">
 <!--Message type-->
 <_0065><!--Delivery schedule message-->DELFOR</_0065>
 <!--Message version number-->
 <_0052><!--Draft version/UN/EDIFACT Directory-->D</_0052>
 <!--Message release number-->
 <_0054><!--Release 1999 - B-->99B</_0054>
 <!--Controlling agency, coded-->
 <_0051><!--UN/CEFACT-->UN</_0051>
 </S009>
 </Meta>
 <BGM type="Segment">
 <!--DOCUMENT/MESSAGE NAME-->
 <C002 type="Composite">
 <!--Document name code-->
 <_1001><!--Delivery schedule-->241</_1001>
 </C002>
 <!--DOCUMENT/MESSAGE IDENTIFICATION-->
 <C106 type="Composite">
 <!--Document/message number-->
 <_1004>DELFOR0000001</_1004>
 </C106>
 <!--Message function code-->
 <_1225><!--Replace-->5</_1225>
 <!--Response type code-->
 <_4343><!--Message acknowledgement-->AB</_4343>
 </BGM>
 <DTM type="Segment">
 <!--DATE/TIME/PERIOD-->
 <C507 type="Composite">
 <!--Date/time/period function code qualifier-->
 <_2005>137</_2005>
 <!--Date/time/period value-->
 <_2380>20151110</_2380>
 <!--Date/time/period format code-->
 <_2379>102</_2379>
 </C507>
 </DTM>
 <DTM type="Segment">
 <!--DATE/TIME/PERIOD-->
 <C507 type="Composite">
 <!--Date/time/period function code qualifier-->
 <_2005>157</_2005>
 <!--Date/time/period value-->
 <_2380>20151110</_2380>
 <!--Date/time/period format code-->
 <_2379>102</_2379>
 </C507>
 </DTM>
 <NADLoop1 type="Loop">
 <NAD type="Segment">
 <!--Party function code qualifier-->
 <_3035><!--Seller-->SE</_3035>
 <!--PARTY IDENTIFICATION DETAILS-->
 <C082 type="Composite">
 <!--Party identifier-->
 <_3039>Seler code</_3039>
 <!--Code list identification code-->
 <_1131></_1131>
 <!--Code list responsible agency code-->
 <_3055><!--Assigned by buyer or buyer&apos;s agent-->92</_3055>
 </C082>
 <!--NAME AND ADDRESS-->
 <C058 type="Composite">
 </C058>
 <!--PARTY NAME-->
 <C080 type="Composite">
 <!--Party name-->
 <_3036>Seller Name</_3036>
 </C080>
 <!--STREET-->
 <C059 type="Composite">
 <!--Street and number/p.o. box-->
 <_3042>Seller address</_3042>
 </C059>
 <!--City name-->
 <_3164></_3164>
 <!--COUNTRY SUB-ENTITY DETAILS-->
 <C819 type="Composite">
 </C819>
 <!--Postal identification code-->
 <_3251>postcode</_3251>
 <!--Country name code-->
 <_3207>country code</_3207>
 </NAD>
 </NADLoop1>
 <NADLoop1 type="Loop">
 <NAD type="Segment">
 <!--Party function code qualifier-->
 <_3035><!--Buyer-->BY</_3035>
 <!--PARTY IDENTIFICATION DETAILS-->
 <C082 type="Composite">
 <!--Party identifier-->
 <_3039>Buyer code</_3039>
 <!--Code list identification code-->
 <_1131></_1131>
 <!--Code list responsible agency code-->
 <_3055><!--Assigned by seller or seller&apos;s agent-->91</_3055>
 </C082>
 <!--NAME AND ADDRESS-->
 <C058 type="Composite">
 </C058>
 <!--PARTY NAME-->
 <C080 type="Composite">
 <!--Party name-->
 <_3036>Buyer name</_3036>
 </C080>
 <!--STREET-->
 <C059 type="Composite">
 <!--Street and number/p.o. box-->
 <_3042>Buyer address</_3042>
 </C059>
 <!--City name-->
 <_3164></_3164>
 <!--COUNTRY SUB-ENTITY DETAILS-->
 <C819 type="Composite">
 <!--Country sub-entity name code-->
 <_3229></_3229>
 </C819>
 <!--Postal identification code-->
 <_3251>postcode</_3251>
 <!--Country name code-->
 <_3207>country code</_3207>
 </NAD>
 </NADLoop1>
 <GISLoop1 type="Loop">
 <GIS type="Segment">
 <!--PROCESSING INDICATOR-->
 <C529 type="Composite">
 <!--Processing indicator description code-->
 <_7365><!--Product driven scheduling method-->95</_7365>
 </C529>
 </GIS>
 <LINLoop1 type="Loop">
 <LIN type="Segment">
 <!--Line item number-->
 <_1082>1</_1082>
 <!--Action request/notification description code-->
 <_1229/>
 <!--ITEM NUMBER IDENTIFICATION-->
 <C212 type="Composite">
 <!--Item number-->
 <_7140>1234567</_7140>
 <!--Item type identification code-->
 <_7143><!--Buyer&apos;s part number-->BP</_7143>
 <!--Code list identification code-->
 <_1131></_1131>
 <!--Code list responsible agency code-->
 <_3055><!--Assigned by buyer or buyer&apos;s agent-->92</_3055>
 </C212>
 </LIN>
 <IMD type="Segment">
 <!--Item description type, coded-->
 <_7077/>
 <!--ITEM CHARACTERISTIC-->
 <C272 type="Composite">
 </C272>
 <!--ITEM DESCRIPTION-->
 <C273 type="Composite">
 <!--Item description identification-->
 <_7009></_7009>
 <!--Code list identification code-->
 <_1131></_1131>
 <!--Code list responsible agency code-->
 <_3055><!--Assigned by buyer or buyer&apos;s agent-->92</_3055>
 <!--Item description-->
 <_7008>description</_7008>
 </C273>
 </IMD>
 <FTX type="Segment">
 <!--Text subject code qualifier-->
 <_4451><!--Order information-->COI</_4451>
 <!--Text function, coded-->
 <_4453/>
 <!--TEXT REFERENCE-->
 <C107 type="Composite">
 </C107>
 <!--TEXT LITERAL-->
 <C108 type="Composite">
 <!--Free text value-->
 <_4440>Purchase order text</_4440>
 </C108>
 </FTX>
 <RFFLoop4 type="Loop">
 <RFF type="Segment">
 <!--REFERENCE-->
 <C506 type="Composite">
 <!--Reference function code qualifier-->
 <_1153>CO</_1153>
 <!--Reference identifier-->
 <_1154>order number</_1154>
 <!--Line number-->
 <_1156>00001</_1156>
 </C506>
 </RFF>
 </RFFLoop4>
 <RFFLoop4 type="Loop">
 <RFF type="Segment">
 <!--REFERENCE-->
 <C506 type="Composite">
 <!--Reference function code qualifier-->
 <_1153>AAN</_1153>
 <!--Reference identifier-->
 <_1154>2</_1154>
 </C506>
 </RFF>
 <DTM type="Segment">
 <!--DATE/TIME/PERIOD-->
 <C507 type="Composite">
 <!--Date/time/period function code qualifier-->
 <_2005>171</_2005>
 <!--Date/time/period value-->
 <_2380>20151110</_2380>
 <!--Date/time/period format code-->
 <_2379>102</_2379>
 </C507>
 </DTM>
 </RFFLoop4>
 <RFFLoop4 type="Loop">
 <RFF type="Segment">
 <!--REFERENCE-->
 <C506 type="Composite">
 <!--Reference function code qualifier-->
 <_1153>SH</_1153>
 <!--Reference identifier-->
 <_1154>1</_1154>
 </C506>
 </RFF>
 <DTM type="Segment">
 <!--DATE/TIME/PERIOD-->
 <C507 type="Composite">
 <!--Date/time/period function code qualifier-->
 <_2005>171</_2005>
 <!--Date/time/period value-->
 <_2380>20151103</_2380>
 <!--Date/time/period format code-->
 <_2379>102</_2379>
 </C507>
 </DTM>
 </RFFLoop4>
 <NADLoop3 type="Loop">
 <NAD type="Segment">
 <!--Party function code qualifier-->
 <_3035><!--Consignee-->CN</_3035>
 <!--PARTY IDENTIFICATION DETAILS-->
 <C082 type="Composite">
 <!--Party identifier-->
 <_3039>D5</_3039>
 <!--Code list identification code-->
 <_1131></_1131>
 <!--Code list responsible agency code-->
 <_3055><!--Assigned by buyer or buyer&apos;s agent-->92</_3055>
 </C082>
 <!--NAME AND ADDRESS-->
 <C058 type="Composite">
 </C058>
 <!--PARTY NAME-->
 <C080 type="Composite">
 <!--Party name-->
 <_3036>Delivery name</_3036>
 </C080>
 <!--STREET-->
 <C059 type="Composite">
 <!--Street and number/p.o. box-->
 <_3042>Delivery address</_3042>
 </C059>
 <!--City name-->
 <_3164></_3164>
 <!--COUNTRY SUB-ENTITY DETAILS-->
 <C819 type="Composite">
 </C819>
 <!--Postal identification code-->
 <_3251>postcode</_3251>
 <!--Country name code-->
 <_3207>country code</_3207>
 </NAD>
 <CTALoop3 type="Loop">
 <CTA type="Segment">
 <!--Contact function code-->
 <_3139><!--Information contact-->IC</_3139>
 <!--DEPARTMENT OR EMPLOYEE DETAILS-->
 <C056 type="Composite">
 <!--Department or employee identification-->
 <_3413>key</_3413>
 <!--Department or employee-->
 <_3412>name</_3412>
 </C056>
 </CTA>
 <COM type="Segment">
 <!--COMMUNICATION CONTACT-->
 <C076 type="Composite">
 <!--Communication number-->
 <_3148>tel-number</_3148>
 <!--Communication number code qualifier-->
 <_3155>TE</_3155>
 </C076>
 </COM>
 <COM type="Segment">
 <!--COMMUNICATION CONTACT-->
 <C076 type="Composite">
 <!--Communication number-->
 <_3148>fax-number</_3148>
 <!--Communication number code qualifier-->
 <_3155>FX</_3155>
 </C076>
 </COM>
 </CTALoop3>
 <QTYLoop3 type="Loop">
 <QTY type="Segment">
 <!--QUANTITY DETAILS-->
 <C186 type="Composite">
 <!--Quantity type code qualifier-->
 <_6063><!--Received quantity-->48</_6063>
 <!--Quantity-->
 <_6060>576</_6060>
 <!--Measurement unit code-->
 <_6411>PCE</_6411>
 </C186>
 </QTY>
 <DTM type="Segment">
 <!--DATE/TIME/PERIOD-->
 <C507 type="Composite">
 <!--Date/time/period function code qualifier-->
 <_2005>50</_2005>
 <!--Date/time/period value-->
 <_2380>20151013</_2380>
 <!--Date/time/period format code-->
 <_2379>102</_2379>
 </C507>
 </DTM>
 <RFFLoop7 type="Loop">
 <RFF type="Segment">
 <!--REFERENCE-->
 <C506 type="Composite">
 <!--Reference function code qualifier-->
 <_1153>DQ</_1153>
 <!--Reference identifier-->
 <_1154>DN0000001</_1154>
 </C506>
 </RFF>
 </RFFLoop7>
 </QTYLoop3>
 <SCCLoop2 type="Loop">
 <SCC type="Segment">
 <!--Delivery plan commitment level code-->
 <_4017><!--Commitment for material-->3</_4017>
 </SCC>
 <QTYLoop4 type="Loop">
 <QTY type="Segment">
 <!--QUANTITY DETAILS-->
 <C186 type="Composite">
 <!--Quantity type code qualifier-->
 <_6063><!--Quantity to be delivered-->113</_6063>
 <!--Quantity-->
 <_6060>576</_6060>
 <!--Measurement unit code-->
 <_6411>PCE</_6411>
 </C186>
 </QTY>
 <DTM type="Segment">
 <!--DATE/TIME/PERIOD-->
 <C507 type="Composite">
 <!--Date/time/period function code qualifier-->
 <_2005>2</_2005>
 <!--Date/time/period value-->
 <_2380>20160121</_2380>
 <!--Date/time/period format code-->
 <_2379>102</_2379>
 </C507>
 </DTM>
 </QTYLoop4>
 </SCCLoop2>
 <SCCLoop2 type="Loop">
 <SCC type="Segment">
 <!--Delivery plan commitment level code-->
 <_4017><!--Planning/forecast-->4</_4017>
 </SCC>
 <QTYLoop4 type="Loop">
 <QTY type="Segment">
 <!--QUANTITY DETAILS-->
 <C186 type="Composite">
 <!--Quantity type code qualifier-->
 <_6063><!--Quantity to be delivered-->113</_6063>
 <!--Quantity-->
 <_6060>576</_6060>
 <!--Measurement unit code-->
 <_6411>PCE</_6411>
 </C186>
 </QTY>
 <DTM type="Segment">
 <!--DATE/TIME/PERIOD-->
 <C507 type="Composite">
 <!--Date/time/period function code qualifier-->
 <_2005>2</_2005>
 <!--Date/time/period value-->
 <_2380>20160211</_2380>
 <!--Date/time/period format code-->
 <_2379>102</_2379>
 </C507>
 </DTM>
 </QTYLoop4>
 <QTYLoop4 type="Loop">
 <QTY type="Segment">
 <!--QUANTITY DETAILS-->
 <C186 type="Composite">
 <!--Quantity type code qualifier-->
 <_6063><!--Quantity to be delivered-->113</_6063>
 <!--Quantity-->
 <_6060>576</_6060>
 <!--Measurement unit code-->
 <_6411>PCE</_6411>
 </C186>
 </QTY>
 <DTM type="Segment">
 <!--DATE/TIME/PERIOD-->
 <C507 type="Composite">
 <!--Date/time/period function code qualifier-->
 <_2005>2</_2005>
 <!--Date/time/period value-->
 <_2380>20160331</_2380>
 <!--Date/time/period format code-->
 <_2379>102</_2379>
 </C507>
 </DTM>
 </QTYLoop4>
 </SCCLoop2>
 </NADLoop3>
 </LINLoop1>
 </GISLoop1>
 </TX-D99B-DELFOR>
 </TransactionSet>
  1. 使用XML Map端口,将标准XML格式转换为自定义XML

下文输出的自定义XML,仅保留了与核心业务相关的数据,阅读起来简单直白。

以Delivery Schedule为例:

<Item>
 <OrderHeader>
 <!-- 交货计划编号 -->
 <forecase_number>DELFOR0000001</forecase_number> 
 <!-- 交货计划日期 -->
 <create_datetime>20151110</create_datetime>
 <!-- 采购方编号 -->
 <buyer_code>Buyer code</buyer_code>
 <!-- 采购方姓名 -->
 <buyer_name>Buyer Name</buyer_name>
 <!-- 采购方地址 -->
 <buyer_address>Buyer address</buyer_address>
 <!-- 销售方编号 -->
 <seller_code>Seller code</seller_code>
 <!-- 销售方姓名 -->
 <seller_name>Seller Name</seller_name>
 <!-- 销售方地址 -->
 <seller_address>Seller address</seller_address>
 <!-- 交货计划明细行 下文有三条明细数据 -->
 <OrderLine>
 <!-- 采购方物料编号 -->
 <buyer_item_number>1234567</buyer_item_number>
 <!-- 物料描述 -->
 <item_descript>description</item_descript>
 <!-- 采购订单编号 -->
 <order_number>order number</order_number>
 <!-- 采购订单行号 -->
 <order_line_no>00001</order_line_no>
 <!-- 需求数量 -->
 <quantity>576</quantity>
 <!-- 需求日期 -->
 <delivery_datetime>20160121</delivery_datetime>
 <!-- 开始日期 -->
 <start_datetime></start_datetime>
 <!-- 结束日期 -->
 <end_datetime></end_datetime>
 <!-- 收货方仓库 -->
 <delivery_code>01</delivery_code>
 <!-- 收货方姓名 -->
 <delivery_name>Delivery Name</delivery_name>
 <!-- 收货方地址 -->
 <delivery_address>Delivery address</delivery_address>
 </OrderLine>
 <OrderLine>
 <buyer_item_number>1234567</buyer_item_number>
 <item_descript>description</item_descript>
 <order_number>order number</order_number>
 <order_line_no>00001</order_line_no>
 <quantity>576</quantity>
 <delivery_datetime></delivery_datetime>
 <start_datetime>20170101</start_datetime>
 <end_datetime>20170131</end_datetime>
 <delivery_code>01</delivery_code>
 <delivery_name>Delivery Name</delivery_name>
 <delivery_address>Delivery address</delivery_address>
 </OrderLine>
 <OrderLine>
 <buyer_item_number>1234567</buyer_item_number>
 <item_descript>description</item_descript>
 <order_number>order number</order_number>
 <order_line_no>00001</order_line_no>
 <quantity>576</quantity>
 <delivery_datetime></delivery_datetime>
 <start_datetime>20170301</start_datetime>
 <end_datetime>20170331</end_datetime>
 <delivery_code>01</delivery_code>
 <delivery_name>Delivery Name</delivery_name>
 <delivery_address>Delivery address</delivery_address>
 </OrderLine>
 </OrderHeader>
</Item>

小技巧:当发现无法将两个XML文件的字段对应起来的时候,可以试试找找值相同的标签,再比对下注释。

更多EDI系统标准XML到客户自定义XML的转换步骤,可查看。

更多STIHL文章

  • 总览: [案例] STIHL EDI解决方案
  • DELFOR:[案例] STIHL EDI – DELFOR 分析
  • DESADV:[案例] STIHL EDI – DESADV
  • DESADV:[案例] STIHL EDI – DESADV自定义XML 方案

921f30a55ac3a72807ef7783fd1bf76c.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值