Hello,大家好!欢迎大家来到小知课堂,我们这一篇要讲的是XML Map 端口的使用方法。顾名思义,XML Map 端口的主要功能就是完成两个不同XML文件的关系映射,为什么要实现这个功能呢?当然是为了实现神秘莫测的EDI标准XML文件和简单易懂的XML文件之间的相互转换,所以在很多EDI解决方案中,XML Map 端口都能发挥它举足轻重的作用。下面,就让我们一起来揭开XML Map 端口的神秘面纱。
扩展阅读: – 为什么工作流中围绕XML做EDI报文数据解析/生成? – XML Map端口功能详解
在正式使用XML Map 端口之前,我们先来了解一下此端口的内部构造,和其他端口类似,XML Map端口的基础设置在Settings界面,Advanced则是我们的高级选项配置,Input/Output界面负责收发文件,Events界面用来写触发事件的代码,如下图所示:
1. XML Map 端口的基本配置
从上图我们可以看到Settings界面十分简洁,需要我们来配置的基本来说只有三处。下面我们来一一说明这三处的作用:
- Source File:配置源XML文件的模板,例如,要将EDI标准XML文件转换为其他格式的XML文件,则这时的源文件则为EDI标准XML文件。
- Destination File:配置目标XML文件的模板,此处要配置的模板即为上面例子中的其他XML文件。
- Automation Setting:配置自动化功能,勾选上Send后,转发到该端口的XML文件会自动完成对应的关系转换,并转发到下一个端口。
2. XML Map 端口映射功能
XML Map端口主要的功能就是通过鼠标拖拽并建立关系映射,下面小知就以DELFOR报文(订单预测报文)的XML文件映射为简介易懂的XML文件为例,来讲解该功能。
2.1 添加模板
首先我们来看看DELFOR报文的XML文件的格式,下面为DELFOR报文的XML文件的部分内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<BGM type="Segment"> <!--DOCUMENT/MESSAGE NAME--> <C002 type="Composite"> <!--Document name code--> <_1001> <!--Delivery forecast--></_1001> </C002> <!--DOCUMENT/MESSAGE IDENTIFICATION--> <C106 type="Composite"> <!--Document identifier--> <_1004>123456</_1004> </C106> </BGM> <DTM type="Segment"> <!--DATE/TIME/PERIOD--> <C507 type="Composite"> <!--Date or time or period function code qualifier--> <_2005> <!--Document/message date/time-->137</_2005> <!--Date or time or period text--> <_2380>202002021413</_2380> <!--Date or time or period format code--> <_2379> <!--CCYYMMDDHHMM-->203</_2379> </C507> </DTM> <DTM type="Segment"> <!--DATE/TIME/PERIOD--> <C507 type="Composite"> <!--Date or time or period function code qualifier--> <_2005> <!--Horizon start date-->158</_2005> <!--Date or time or period text--> <_2380>20200202</_2380> <!--Date or time or period format code--> <_2379> <!--CCYYMMDD-->102</_2379> </C507> </DTM> |
这样格式的XML文件,显然可读性不高,而如果转换为下面的XML文件理解起来就容易多了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<Items> <test_order> <create_date/> <!-- 订单创建日期 --> <order_number /> <!-- 订单号码 --> <eta_datetime /> <BY_name /> <!-- 买家名称 --> <BY_number /> <!-- 买家身份标识ID --> <SE_name /> <!-- 卖家名称 --> <SE_number /> <!-- 卖家身份标识ID --> <status/> <test_item> <!-- 订单明细 --> <last_despatch_date /> <!-- 最后一次发货日期 --> <item_desc /> <!-- 产品描述 --> <item_number /> <!-- 产品编号 --> <line_number /> <!-- 订单明细行号 --> <po_nunmber /> <!-- 采购订单 --> <last_qty /> <last_unit /> <test_order_plan> <item_qty /> <item_unit /> <delivery_date /> <plan_code /> </test_order_plan> </test_item> </test_order> </Items> |
设计好对应的模板后,我们需要点击Upload Sample File按钮,上传对应的模板文件,如下图所示:
上传完对应的模板后,在下方的Mappings中就能看到两种模板对应的结构了,如下图所示:
2.2 关系映射
添加了转换对应的模板后,我们就可以开始做两个XML文件的关系映射了。在进行关系映射的过程中,我们只需要将Source下的节点一一拖拽到对应Destination上即可,如下图所示:
2.3 添加条件
在将Source和Destination的各个节点一一映射时,往往还需要添加些判断条件,例如当DTM/C507/_2005等于137时,我们取DTM/C507/_2380为对应的目标XML中 create_date的值,此时我们将鼠标放到create_date节点上,然后点击该节点的condition图标,如下图所示:
在弹出的模态框中,点击右上角的Add Condition按钮,选择所要添加的条件对应的节点和条件的对应规则,如下图所示:
添加完条件后,我们可以看到Mapping中的映射关系就变为了下图:
2.4 代码添加
如果Destination模板中的某一节点有固定的值,此时我们可以将鼠标放到该节点上,并点击其右边出现的Experssion图标,在弹出的模态框中定义其值,例如status列的固定为0,此时我们就可以如下图设置:
另外在该模态框中,可以添加代码,用来实现某种功能,例如需要判断order_number对应于报文中的值是否存在,如果不存在则提示错误,这时我们就可以这样来实现,如下图所示:
3. 转换文件格式
完成上面的关系映射后,我们就可以在Input界面上传符合源文件格式的XML文件了。如下图所示:
转换成功后我们在Output界面下载转换好的文件,查看转化好的文件,已经将EDI报文标准XML文件中的有效信息提取出来并输出到目标格式的XML文件中了,转换好的XML 文件如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<Items> <test_order> <create_date>202002021413</create_date> <order_number>123456</order_number> <eta_datetime>20200202</eta_datetime> <BY_name>CompanyA</BY_name> <BY_number>12345678</BY_number> <SE_name>SE Company</SE_name> <SE_number>9876543</SE_number> <status>0</status> <test_item> <last_despatch_date>20200202</last_despatch_date> <item_desc>ABCDEFG</item_desc> <item_number>Item001</item_number> <line_number>001</line_number> <po_nunmber>PO-123456</po_nunmber> <destination_place>LOC01</destination_place> <last_qty>100</last_qty> <last_unit>PCE</last_unit> <test_order_plan> <item_qty>10</item_qty> <item_unit>PCE</item_unit> <delivery_date>20200202</delivery_date> <plan_code>Y</plan_code> </test_order_plan> <test_order_plan> <item_qty>500</item_qty> <item_unit>PCE</item_unit> <delivery_date>20200202</delivery_date> <plan_code>W</plan_code> </test_order_plan> </test_item> </test_order> </Items> |
4. 高级配置
在讲完了以上的基础功能后,我们来看看开发人员为我们设计的高级选项配置,点击Advanced,会出现下面的界面:
在XML Map 端口的高级选项配置中,Local Folder是用来配置待发送文件、已接收文件、已发送文件存储位置的地方,Performance配置端口性能,我们将鼠标放置在对应的输入框上,就能看到对应功能的提示信息。下面我们着重讲解一下Other Settings的配置,首先Local File Scheme是指在此端口完成映射后的文件名称,也就是Ouput界面显示的文件名称,例如,我们将该内容配置为:%PortID%%FilenameNoExt%%ShortDate%,此时映射成功的文件在Output界面显示的文件名如下图所示:
而Send Filter则表示的是转发到此端口的文件名匹配设置,例如我们只希望接受后缀为XML的文件,此时设置该内容为*.xml,此时如果我们从EDIFACT 端口将不同后缀的文件转发到XML Map 端口 ,如下图所示:
可以看到XML Map 端口只收到了后缀为XML的文件:
5. XML Map 端口的优点
在使用XML Map 端口时,小知感到最流畅的地方就是任意父节点对应的结构是能够循环读取的,如上面的例子,如果一个DELFOR中含有多个物料的信息,对应于DELFOR报文的XML文件中的结构就是有多个LINLoop1结构,而对应于目标的XML文件来说就是含有多个test_item结构,此时我们只需要拖拽完模板中一个LINLoop1和test_item的映射关系,在将DELFOR报文的XML转换为目标XML时,其会自动循环读取LINLoop1中的内容,并生成多个test_item结构。就如同上例中的SCCLoop1和test_order_plan对应关系,一个物料信息中包含了两个不同的预测信息,所以在生成对应的XML时自动循环读取了SCCLoop1中的值,并生成了两个test_order_plan结构。
另外在报文的XML文件和数据库格式的XML文件相互转换时就更为方便了,此时我们只需要连接上两个端口,并且在Database 端口添加对应的模板,这时就可以直接在XML Map 端口使用Database 端口添加的模板,而不用重新设计模板,并导入XML Map 端口了。例如此时将DELFOR的XML文件转换为test_order表对应的XML文件,并写入数据库,就可以先在Database 端口的Settings下Mapping的Input模块中添加模板,如下图所示:
添加成功后,我们返回XML Map 端口,点击Destination的下拉框,可以看到这里已经添加了Database 端口对应的Input模板了,如下图所示:
6. 需要提升的点
这节课到这里就快结束了,在正式结束之前我们来总结一下XML Map 端口,小知觉得这个端口的不足之处就是页面配置时不能自定义错误消息,例如上面所讲述的判断某个值是否为空,为空时报错,判断是否为空可以在Condition的模态框中添加条件,但是为空时报错就只能通过代码的形式实现。这使得很多小伙伴在使用时不太方便。好了,今天的分享就到这里,大家在使用知行EDI系统的过程中有任何疑问的地方,欢迎随时联系邮箱:edi@kasoftware.cn。
这节课就结束了,大家学会了吗?
注:文案部分图片及内容来源于网络,版权归原创作者所有,如有侵犯到您的权益,请您联系我们进行删除,给您带来困扰,我们深感抱歉。