如何EDI標準文件轉換爲自定義XML?

今天分享EDI報文轉換,主要圍繞X12標準 850 採購訂單展開介紹。

以下方案的源代碼先分享出來。
https://www.kasoftware.com/translation/edi_xml_convert_sample.html

實現EDI轉自定義XML,可以分兩步完成。

  1. 根據國際標準,先將EDI文件轉換爲標準的XML文件;
  2. 通過腳本,實現標準XML與自定義XML的關係映射。

在這裏插入圖片描述

以850採購訂單爲例,源文件如下:

ISA*00*          *00*          *ZZ*WAYNE_TECH     *ZZ*ACME           *160609*1330*U*00401*000000007*0*T*>~
GS*PO*WAYNE_TECH*ACME*20160609*1330*7*T*004010~
ST*850*0001~
BEG*00*DS*0476696888**20150708~
REF*SB*ZZ11~
REF*6P*ZZ~
REF*8M*0056~
REF*CR*1070335099~
REF*CO*7109790082~
PER*CN*ACME, Inc.*TE*(555) 555-5555~
CSH*SC~
SAC*C*ZZZZ**********06~
TD5*Z*2*123456~
N9*PD*ZCOF~
MSG*Thanks!~
N1*BY*Wayne Tech*92*5601~
N2*Wayne Tech*~
N3*125 WayneHigh Road.~
N1*EN*ACME, Inc.~
N1*ST*Wayne Tech Plant 1*92*0000505462~
N2*Wayne Tech Plant 1*~
N3*100 Wayne Ave.~
N4*Chapel Hill*MX*27514*US**~
PO1**500000*EA*495*TP*BP*337S3744*VP*422242224~
PID*F****500,000 red widgets****EN~
SCH*500000*EA***002*20180708~
PO1**100*EA*395*HP*BP*337S3745*VP*422242226~
PID*F****100 blue widgets****EN~
SCH*100*EA***002*20180708~
PO1**500*EA*210*TP*BP*337S3746*VP*422201210~
PID*F****AH-0310 red widgets****EN~
SCH*500*EA***002*20180708~
PO1**150*EA*350*TP*BP*337S3747*VP*422241452~
PID*F****F-100 blue widgets****EN~
SCH*100*EA***002*20180708~
PO1**500000*EA*495*TP*BP*337S3748*VP*422244512~
PID*F****HU-021 black widgets****EN~
SCH*500000*EA***002*20180708~
PO1**1500*EA*3000*HP*BP*337S3749*VP*422241023~
PID*F****100-20J widgets****EN~
SCH*100*EA***002*20180708~
CTT*6*500100~
SE*39*0001~
GE*1*7~
IEA*1*000000007~

先看轉換標準XML的結果,內容看似很長,一半以上的內容都是註釋,解釋每個字段對應的業務含義,即便沒有EDI規範,也可以快速瞭解該EDI文件都包含了哪些業務數據:

<Interchange Delimiters=":*. ^~" xmlns="http://www.rssbus.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Meta>
		<!--Authorization Information Qualifier-->
		<ISA01><!--No Authorization Information Present (No Meaningful Information in I02)-->00</ISA01>
		<!--Authorization Information-->
		<ISA02>          </ISA02>
		<!--Security Information Qualifer-->
		<ISA03>00</ISA03>
		<!--Security Information-->
		<ISA04>          </ISA04>
		<!--Interchange ID Qualifier-->
		<ISA05><!--Mutually Defined-->ZZ</ISA05>
		<!--Interchange Sender ID-->
		<ISA06>WAYNE_TECH     </ISA06>
		<!--Interchange ID Qualifier-->
		<ISA07><!--Mutually Defined-->ZZ</ISA07>
		<!--Interchange Receiver ID-->
		<ISA08>ACME           </ISA08>
		<!--Interchange Date-->
		<ISA09>160609</ISA09>
		<!--Interchange Time-->
		<ISA10>1330</ISA10>
		<!--Interchange Control Standards Identifier-->
		<ISA11>U</ISA11>
		<!--Interchange Control Version Number Code-->
		<ISA12><!--Standards Approved for Publication by ASC X12 Procedures Review Board through October 1997-->00401</ISA12>
		<!--Inter Control Number-->
		<ISA13>000000007</ISA13>
		<!--Acknowlegment Requested Code-->
		<ISA14>0</ISA14>
		<!--Interchange Usage Indicator Code-->
		<ISA15><!--Test Data-->T</ISA15>
		<!--Component Element Separator-->
		<ISA16>&gt;</ISA16>
	</Meta>
	<FunctionalGroup>
		<Meta>
			<!--Functional Identifier Code-->
			<GS01><!--Purchase Order (850)-->PO</GS01>
			<!--Application Sender&apos;s Code-->
			<GS02>WAYNE_TECH</GS02>
			<!--Application Receiver&apos;s Code-->
			<GS03>ACME</GS03>
			<!--Date-->
			<GS04>20160609</GS04>
			<!--Time-->
			<GS05>1330</GS05>
			<!--Group Control Number-->
			<GS06>7</GS06>
			<!--Responsible Agency Code-->
			<GS07><!--Transportation Data Coordinating Committee (TDCC)-->T</GS07>
			<!--Version / Release / Industry Identifier Code-->
			<GS08><!--Standards Approved for Publication by ASC X12 Procedures Review Board through October 1997-->004010</GS08>
		</Meta>
		<TransactionSet>
			<TX-00401-850 type="TransactionSet">
				<Meta>
					<!--Transaction Set Identifier Code-->
					<ST01><!--Purchase Order-->850</ST01>
					<!--Transaction Set Control Number-->
					<ST02>0001</ST02>
				</Meta>
				<BEG type="Segment">
					<!--Transaction Set Purpose Code-->
					<BEG01><!--Original-->00</BEG01>
					<!--Purchase Order Type Code-->
					<BEG02><!--Dropship-->DS</BEG02>
					<!--Purchase Order Number-->
					<BEG03>0476696888</BEG03>
					<!--Release Number-->
					<BEG04 xsi:nil="true"/>
					<!--Date-->
					<BEG05>20150708</BEG05>
				</BEG>
				<REF type="Segment">
					<!--Reference Identification Qualifier-->
					<REF01><!--Sales Region Number-->SB</REF01>
					<!--Reference Identification-->
					<REF02>ZZ11</REF02>
				</REF>
				<REF type="Segment">
					<!--Reference Identification Qualifier-->
					<REF01><!--Group Number-->6P</REF01>
					<!--Reference Identification-->
					<REF02>ZZ</REF02>
				</REF>
				<REF type="Segment">
					<!--Reference Identification Qualifier-->
					<REF01><!--Originating Company Identifier-->8M</REF01>
					<!--Reference Identification-->
					<REF02>0056</REF02>
				</REF>
				<REF type="Segment">
					<!--Reference Identification Qualifier-->
					<REF01><!--Customer Reference Number-->CR</REF01>
					<!--Reference Identification-->
					<REF02>1070335099</REF02>
				</REF>
				<REF type="Segment">
					<!--Reference Identification Qualifier-->
					<REF01><!--Customer Order Number-->CO</REF01>
					<!--Reference Identification-->
					<REF02>7109790082</REF02>
				</REF>
				<PER type="Segment">
					<!--Contact Function Code-->
					<PER01><!--General Contact-->CN</PER01>
					<!--Name-->
					<PER02>ACME, Inc.</PER02>
					<!--Communication Number Qualifier-->
					<PER03><!--Telephone-->TE</PER03>
					<!--Communication Number-->
					<PER04>(555) 555-5555</PER04>
				</PER>
				<CSH type="Segment">
					<!--Sales Requirement Code-->
					<CSH01><!--Ship Complete-->SC</CSH01>
				</CSH>
				<SACLoop1 type="Loop">
					<SAC type="Segment">
						<!--Allowance or Charge Indicator-->
						<SAC01>C</SAC01>
						<!--Service, Promotion, Allowance, or Charge Code-->
						<SAC02><!--Mutually Defined-->ZZZZ</SAC02>
						<!--Agency Qualifier Code-->
						<SAC03/>
						<!--Agency Service, Promotion, Allowance, or Charge Code-->
						<SAC04 xsi:nil="true"/>
						<!--Amount-->
						<SAC05 xsi:nil="true"/>
						<!--Allowance/Charge Percent Qualifier-->
						<SAC06/>
						<!--Percent-->
						<SAC07 xsi:nil="true"/>
						<!--Rate-->
						<SAC08 xsi:nil="true"/>
						<!--Unit or Basis for Measurement Code-->
						<SAC09/>
						<!--Quantity-->
						<SAC10 xsi:nil="true"/>
						<!--Quantity-->
						<SAC11 xsi:nil="true"/>
						<!--Allowance or Charge Method of Handling Code-->
						<SAC12><!--Charge to be Paid by Customer-->06</SAC12>
					</SAC>
				</SACLoop1>
				<TD5 type="Segment">
					<!--Routing Sequence Code-->
					<TD501><!--Mutually Defined-->Z</TD501>
					<!--Identification Code Qualifier-->
					<TD502><!--Standard Carrier Alpha Code (SCAC)-->2</TD502>
					<!--Identification Code-->
					<TD503>123456</TD503>
				</TD5>
				<N9Loop1 type="Loop">
					<N9 type="Segment">
						<!--Reference Identification Qualifier-->
						<N901><!--Promotion/Deal Number-->PD</N901>
						<!--Reference Identification-->
						<N902>ZCOF</N902>
					</N9>
					<MSG type="Segment">
						<!--Free-Form Message Text-->
						<MSG01>Thanks!</MSG01>
					</MSG>
				</N9Loop1>
				<N1Loop1 type="Loop">
					<N1 type="Segment">
						<!--Entity Identifier Code-->
						<N101><!--Buying Party (Purchaser)-->BY</N101>
						<!--Name-->
						<N102>Wayne Tech</N102>
						<!--Identification Code Qualifier-->
						<N103><!--Assigned by Buyer or Buyer&apos;s Agent-->92</N103>
						<!--Identification Code-->
						<N104>5601</N104>
					</N1>
					<N2 type="Segment">
						<!--Name-->
						<N201>Wayne Tech</N201>
					</N2>
					<N3 type="Segment">
						<!--Address Information-->
						<N301>125 WayneHigh Road.</N301>
					</N3>
				</N1Loop1>
				<N1Loop1 type="Loop">
					<N1 type="Segment">
						<!--Entity Identifier Code-->
						<N101><!--End User-->EN</N101>
						<!--Name-->
						<N102>ACME, Inc.</N102>
					</N1>
				</N1Loop1>
				<N1Loop1 type="Loop">
					<N1 type="Segment">
						<!--Entity Identifier Code-->
						<N101><!--Ship To-->ST</N101>
						<!--Name-->
						<N102>Wayne Tech Plant 1</N102>
						<!--Identification Code Qualifier-->
						<N103><!--Assigned by Buyer or Buyer&apos;s Agent-->92</N103>
						<!--Identification Code-->
						<N104>0000505462</N104>
					</N1>
					<N2 type="Segment">
						<!--Name-->
						<N201>Wayne Tech Plant 1</N201>
					</N2>
					<N3 type="Segment">
						<!--Address Information-->
						<N301>100 Wayne Ave.</N301>
					</N3>
					<N4 type="Segment">
						<!--City Name-->
						<N401>Chapel Hill</N401>
						<!--State or Province Code-->
						<N402>MX</N402>
						<!--Postal Code-->
						<N403>27514</N403>
						<!--Country Code-->
						<N404>US</N404>
					</N4>
				</N1Loop1>
				<PO1Loop1 type="Loop">
					<PO1 type="Segment">
						<!--Assigned Identification-->
						<PO101 xsi:nil="true"/>
						<!--Quantity Ordered-->
						<PO102>500000</PO102>
						<!--Unit or Basis for Measurement Code-->
						<PO103><!--Each-->EA</PO103>
						<!--Unit Price-->
						<PO104>495</PO104>
						<!--Basis of Unit Price Code-->
						<PO105><!--Price per Thousand-->TP</PO105>
						<!--Product/Service ID Qualifier-->
						<PO106><!--Buyer&apos;s Part Number-->BP</PO106>
						<!--Product/Service ID-->
						<PO107>337S3744</PO107>
						<!--Product/Service ID Qualifier-->
						<PO108><!--Vendor&apos;s (Seller&apos;s) Part Number-->VP</PO108>
						<!--Product/Service ID-->
						<PO109>422242224</PO109>
					</PO1>
					<PIDLoop1 type="Loop">
						<PID type="Segment">
							<!--Item Description Type-->
							<PID01>F</PID01>
							<!--Product/Process Characteristic Code-->
							<PID02/>
							<!--Agency Qualifier Code-->
							<PID03/>
							<!--Product Description Code-->
							<PID04 xsi:nil="true"/>
							<!--Description-->
							<PID05>500,000 red widgets</PID05>
							<!--Surface/Layer/Position Code-->
							<PID06/>
							<!--Source Subqualifier-->
							<PID07 xsi:nil="true"/>
							<!--Yes/No Condition or Response Code-->
							<PID08/>
							<!--Language Code-->
							<PID09>EN</PID09>
						</PID>
					</PIDLoop1>
					<SCHLoop1 type="Loop">
						<SCH type="Segment">
							<!--Quantity-->
							<SCH01>500000</SCH01>
							<!--Unit or Basis for Measurement Code-->
							<SCH02><!--Each-->EA</SCH02>
							<!--Entity Identifier Code-->
							<SCH03/>
							<!--Name-->
							<SCH04 xsi:nil="true"/>
							<!--Date/Time Qualifier-->
							<SCH05><!--Delivery Requested-->002</SCH05>
							<!--Date-->
							<SCH06>20180708</SCH06>
						</SCH>
					</SCHLoop1>
				</PO1Loop1>
				<PO1Loop1 type="Loop">
					<PO1 type="Segment">
						<!--Assigned Identification-->
						<PO101 xsi:nil="true"/>
						<!--Quantity Ordered-->
						<PO102>100</PO102>
						<!--Unit or Basis for Measurement Code-->
						<PO103><!--Each-->EA</PO103>
						<!--Unit Price-->
						<PO104>395</PO104>
						<!--Basis of Unit Price Code-->
						<PO105><!--Price per Hundred-->HP</PO105>
						<!--Product/Service ID Qualifier-->
						<PO106><!--Buyer&apos;s Part Number-->BP</PO106>
						<!--Product/Service ID-->
						<PO107>337S3745</PO107>
						<!--Product/Service ID Qualifier-->
						<PO108><!--Vendor&apos;s (Seller&apos;s) Part Number-->VP</PO108>
						<!--Product/Service ID-->
						<PO109>422242226</PO109>
					</PO1>
					<PIDLoop1 type="Loop">
						<PID type="Segment">
							<!--Item Description Type-->
							<PID01>F</PID01>
							<!--Product/Process Characteristic Code-->
							<PID02/>
							<!--Agency Qualifier Code-->
							<PID03/>
							<!--Product Description Code-->
							<PID04 xsi:nil="true"/>
							<!--Description-->
							<PID05>100 blue widgets</PID05>
							<!--Surface/Layer/Position Code-->
							<PID06/>
							<!--Source Subqualifier-->
							<PID07 xsi:nil="true"/>
							<!--Yes/No Condition or Response Code-->
							<PID08/>
							<!--Language Code-->
							<PID09>EN</PID09>
						</PID>
					</PIDLoop1>
					<SCHLoop1 type="Loop">
						<SCH type="Segment">
							<!--Quantity-->
							<SCH01>100</SCH01>
							<!--Unit or Basis for Measurement Code-->
							<SCH02><!--Each-->EA</SCH02>
							<!--Entity Identifier Code-->
							<SCH03/>
							<!--Name-->
							<SCH04 xsi:nil="true"/>
							<!--Date/Time Qualifier-->
							<SCH05><!--Delivery Requested-->002</SCH05>
							<!--Date-->
							<SCH06>20180708</SCH06>
						</SCH>
					</SCHLoop1>
				</PO1Loop1>
				<PO1Loop1 type="Loop">
					<PO1 type="Segment">
						<!--Assigned Identification-->
						<PO101 xsi:nil="true"/>
						<!--Quantity Ordered-->
						<PO102>500</PO102>
						<!--Unit or Basis for Measurement Code-->
						<PO103><!--Each-->EA</PO103>
						<!--Unit Price-->
						<PO104>210</PO104>
						<!--Basis of Unit Price Code-->
						<PO105><!--Price per Thousand-->TP</PO105>
						<!--Product/Service ID Qualifier-->
						<PO106><!--Buyer&apos;s Part Number-->BP</PO106>
						<!--Product/Service ID-->
						<PO107>337S3746</PO107>
						<!--Product/Service ID Qualifier-->
						<PO108><!--Vendor&apos;s (Seller&apos;s) Part Number-->VP</PO108>
						<!--Product/Service ID-->
						<PO109>422201210</PO109>
					</PO1>
					<PIDLoop1 type="Loop">
						<PID type="Segment">
							<!--Item Description Type-->
							<PID01>F</PID01>
							<!--Product/Process Characteristic Code-->
							<PID02/>
							<!--Agency Qualifier Code-->
							<PID03/>
							<!--Product Description Code-->
							<PID04 xsi:nil="true"/>
							<!--Description-->
							<PID05>AH-0310 red widgets</PID05>
							<!--Surface/Layer/Position Code-->
							<PID06/>
							<!--Source Subqualifier-->
							<PID07 xsi:nil="true"/>
							<!--Yes/No Condition or Response Code-->
							<PID08/>
							<!--Language Code-->
							<PID09>EN</PID09>
						</PID>
					</PIDLoop1>
					<SCHLoop1 type="Loop">
						<SCH type="Segment">
							<!--Quantity-->
							<SCH01>500</SCH01>
							<!--Unit or Basis for Measurement Code-->
							<SCH02><!--Each-->EA</SCH02>
							<!--Entity Identifier Code-->
							<SCH03/>
							<!--Name-->
							<SCH04 xsi:nil="true"/>
							<!--Date/Time Qualifier-->
							<SCH05><!--Delivery Requested-->002</SCH05>
							<!--Date-->
							<SCH06>20180708</SCH06>
						</SCH>
					</SCHLoop1>
				</PO1Loop1>
				<PO1Loop1 type="Loop">
					<PO1 type="Segment">
						<!--Assigned Identification-->
						<PO101 xsi:nil="true"/>
						<!--Quantity Ordered-->
						<PO102>150</PO102>
						<!--Unit or Basis for Measurement Code-->
						<PO103><!--Each-->EA</PO103>
						<!--Unit Price-->
						<PO104>350</PO104>
						<!--Basis of Unit Price Code-->
						<PO105><!--Price per Thousand-->TP</PO105>
						<!--Product/Service ID Qualifier-->
						<PO106><!--Buyer&apos;s Part Number-->BP</PO106>
						<!--Product/Service ID-->
						<PO107>337S3747</PO107>
						<!--Product/Service ID Qualifier-->
						<PO108><!--Vendor&apos;s (Seller&apos;s) Part Number-->VP</PO108>
						<!--Product/Service ID-->
						<PO109>422241452</PO109>
					</PO1>
					<PIDLoop1 type="Loop">
						<PID type="Segment">
							<!--Item Description Type-->
							<PID01>F</PID01>
							<!--Product/Process Characteristic Code-->
							<PID02/>
							<!--Agency Qualifier Code-->
							<PID03/>
							<!--Product Description Code-->
							<PID04 xsi:nil="true"/>
							<!--Description-->
							<PID05>F-100 blue widgets</PID05>
							<!--Surface/Layer/Position Code-->
							<PID06/>
							<!--Source Subqualifier-->
							<PID07 xsi:nil="true"/>
							<!--Yes/No Condition or Response Code-->
							<PID08/>
							<!--Language Code-->
							<PID09>EN</PID09>
						</PID>
					</PIDLoop1>
					<SCHLoop1 type="Loop">
						<SCH type="Segment">
							<!--Quantity-->
							<SCH01>100</SCH01>
							<!--Unit or Basis for Measurement Code-->
							<SCH02><!--Each-->EA</SCH02>
							<!--Entity Identifier Code-->
							<SCH03/>
							<!--Name-->
							<SCH04 xsi:nil="true"/>
							<!--Date/Time Qualifier-->
							<SCH05><!--Delivery Requested-->002</SCH05>
							<!--Date-->
							<SCH06>20180708</SCH06>
						</SCH>
					</SCHLoop1>
				</PO1Loop1>
				<PO1Loop1 type="Loop">
					<PO1 type="Segment">
						<!--Assigned Identification-->
						<PO101 xsi:nil="true"/>
						<!--Quantity Ordered-->
						<PO102>500000</PO102>
						<!--Unit or Basis for Measurement Code-->
						<PO103><!--Each-->EA</PO103>
						<!--Unit Price-->
						<PO104>495</PO104>
						<!--Basis of Unit Price Code-->
						<PO105><!--Price per Thousand-->TP</PO105>
						<!--Product/Service ID Qualifier-->
						<PO106><!--Buyer&apos;s Part Number-->BP</PO106>
						<!--Product/Service ID-->
						<PO107>337S3748</PO107>
						<!--Product/Service ID Qualifier-->
						<PO108><!--Vendor&apos;s (Seller&apos;s) Part Number-->VP</PO108>
						<!--Product/Service ID-->
						<PO109>422244512</PO109>
					</PO1>
					<PIDLoop1 type="Loop">
						<PID type="Segment">
							<!--Item Description Type-->
							<PID01>F</PID01>
							<!--Product/Process Characteristic Code-->
							<PID02/>
							<!--Agency Qualifier Code-->
							<PID03/>
							<!--Product Description Code-->
							<PID04 xsi:nil="true"/>
							<!--Description-->
							<PID05>HU-021 black widgets</PID05>
							<!--Surface/Layer/Position Code-->
							<PID06/>
							<!--Source Subqualifier-->
							<PID07 xsi:nil="true"/>
							<!--Yes/No Condition or Response Code-->
							<PID08/>
							<!--Language Code-->
							<PID09>EN</PID09>
						</PID>
					</PIDLoop1>
					<SCHLoop1 type="Loop">
						<SCH type="Segment">
							<!--Quantity-->
							<SCH01>500000</SCH01>
							<!--Unit or Basis for Measurement Code-->
							<SCH02><!--Each-->EA</SCH02>
							<!--Entity Identifier Code-->
							<SCH03/>
							<!--Name-->
							<SCH04 xsi:nil="true"/>
							<!--Date/Time Qualifier-->
							<SCH05><!--Delivery Requested-->002</SCH05>
							<!--Date-->
							<SCH06>20180708</SCH06>
						</SCH>
					</SCHLoop1>
				</PO1Loop1>
				<PO1Loop1 type="Loop">
					<PO1 type="Segment">
						<!--Assigned Identification-->
						<PO101 xsi:nil="true"/>
						<!--Quantity Ordered-->
						<PO102>1500</PO102>
						<!--Unit or Basis for Measurement Code-->
						<PO103><!--Each-->EA</PO103>
						<!--Unit Price-->
						<PO104>3000</PO104>
						<!--Basis of Unit Price Code-->
						<PO105><!--Price per Hundred-->HP</PO105>
						<!--Product/Service ID Qualifier-->
						<PO106><!--Buyer&apos;s Part Number-->BP</PO106>
						<!--Product/Service ID-->
						<PO107>337S3749</PO107>
						<!--Product/Service ID Qualifier-->
						<PO108><!--Vendor&apos;s (Seller&apos;s) Part Number-->VP</PO108>
						<!--Product/Service ID-->
						<PO109>422241023</PO109>
					</PO1>
					<PIDLoop1 type="Loop">
						<PID type="Segment">
							<!--Item Description Type-->
							<PID01>F</PID01>
							<!--Product/Process Characteristic Code-->
							<PID02/>
							<!--Agency Qualifier Code-->
							<PID03/>
							<!--Product Description Code-->
							<PID04 xsi:nil="true"/>
							<!--Description-->
							<PID05>100-20J widgets</PID05>
							<!--Surface/Layer/Position Code-->
							<PID06/>
							<!--Source Subqualifier-->
							<PID07 xsi:nil="true"/>
							<!--Yes/No Condition or Response Code-->
							<PID08/>
							<!--Language Code-->
							<PID09>EN</PID09>
						</PID>
					</PIDLoop1>
					<SCHLoop1 type="Loop">
						<SCH type="Segment">
							<!--Quantity-->
							<SCH01>100</SCH01>
							<!--Unit or Basis for Measurement Code-->
							<SCH02><!--Each-->EA</SCH02>
							<!--Entity Identifier Code-->
							<SCH03/>
							<!--Name-->
							<SCH04 xsi:nil="true"/>
							<!--Date/Time Qualifier-->
							<SCH05><!--Delivery Requested-->002</SCH05>
							<!--Date-->
							<SCH06>20180708</SCH06>
						</SCH>
					</SCHLoop1>
				</PO1Loop1>
				<CTTLoop1 type="Loop">
					<CTT type="Segment">
						<!--Number of Line Items-->
						<CTT01>6</CTT01>
						<!--Hash Total-->
						<CTT02>500100</CTT02>
					</CTT>
				</CTTLoop1>
			</TX-00401-850>
		</TransactionSet>
	</FunctionalGroup>
</Interchange>

大家可以看下這個XML結構,其標籤名稱與原始EDI文件的Segment名稱都是對應的,從BEG開始,到CTT Segment,不同的segment涵蓋不同的業務數據,根據該XML的Xpath取相關的業務數據,難易程度比直接處理EDI文件低很多。
在這裏插入圖片描述

接下來說說,如何從該XML文件獲取數據,生成一個自定義XML。先看Mapping 源代碼,這段代碼可在Script Port直接運行。

<!-- NOTE: Do not edit -->
<rsb:info title="Custom Script" desc="This script will be executed when a file is processed.">
  <input name="PortId"        desc="The id of this port." />
  <input name="MessageId"     desc="The message id." />
  <input name="FilePath"      desc="The path of the file being processed." />
  <input name="FileName"      desc="The name of the file being processed." />
  <output name="Data"         desc="The data that will be write to Receive folder." />
  <output name="FileName"     desc="The name of the output file in Receive folder." />
</rsb:info>

<rsb:set attr="input.uri" value="[FilePath]"/>
<rsb:set attr="input.xpath" value="/Interchange/FunctionalGroup/TransactionSet/TX-00401-850" />

<rsb:call op="xmlDOMSearch" in="input">
  <rsb:set attr="po.po_no" value="[xpath('BEG/BEG03') | def]" />
  <rsb:set attr="output.data">
   <PURORDER>
     <CustomerId>[xpath("REF\[REF01='8M'\]/REF02") | def]</CustomerId>
     <ReferenceNumber>[xpath("REF\[REF01='CR'\]/REF02") | def]</ReferenceNumber>
     <PONumber>[xpath("BEG/BEG03") | def]</PONumber>
     <BillAddress>[xpath("N1Loop1\[N1/N101='BY'\]/N2/N201") | def]</BillAddress>
     <BillLine1>[xpath("N1Loop1\[N1/N101='BY'\]/N3/N301") | def]</BillLine1>
     <BillLine2>[xpath("N1Loop1\[N1/N101='BY'\]/N3/N302") | def]</BillLine2>
     <BillCity>[xpath("N1Loop1\[N1/N101='BY'\]/N4/N401") | def]</BillCity>
     <BillState>[xpath("N1Loop1\[N1/N101='BY'\]/N4/N402") | def]</BillState>
     <BillZip >[xpath("N1Loop1\[N1/N101='BY'\]/N4/N403")  | def]</BillZip >
     <BillCountry>[xpath("N1Loop1\[N1/N101='BY'\]/N4/N404") | def]</BillCountry>
     <ShipAddress>[xpath("N1Loop1\[N1/N101='ST'\]/N2/N201") | def]</ShipAddress>
     <ShipLine1>[xpath("N1Loop1\[N1/N101='ST'\]/N3/N301") | def]</ShipLine1>
     <ShipLine2>[xpath("N1Loop1\[N1/N101='ST'\]/N3/N302") | def]</ShipLine2>
     <ShipCity>[xpath("N1Loop1\[N1/N101='ST'\]/N4/N401") | def]</ShipCity>
     <ShipState>[xpath("N1Loop1\[N1/N101='ST'\]/N4/N402") | def]</ShipState>
     <ShipZip>[xpath("N1Loop1\[N1/N101='ST'\]/N4/N403") | def]</ShipZip>
     <ShipCountry>[xpath("N1Loop1\[N1/N101='ST'\]/N4/N404") | def]</ShipCountry>
     <rsb:call op="xmlDOMSearch?xpath=PO1Loop1">
     <PURORDERLINEITEMS>
       <ItemQty>[xpath("PO1/PO102") | def]</ItemQty>     
       <ItemQtyUnit>[xpath("PO1/PO103") | def]</ItemQtyUnit>
       <ItemPrice>[xpath("PO1/PO104") | def]</ItemPrice>
       <ItemPriceUnit>[xpath("PO1/PO105") | def]</ItemPriceUnit>
       <ItemVendorNo>[xpath("PO1/PO109") | def]</ItemVendorNo>
       <ItemDesc>[xpath("PIDLoop1/PID/PID05") | def]</ItemDesc>
       <DueDate>[xpath("DTM\[DTM01='002'\]/DTM02") | def]</DueDate>
     </PURORDERLINEITEMS>
    </rsb:call>
   </PURORDER>
 </rsb:set>
</rsb:call>

<rsb:set attr="output.filename" value="PO850#[po.po_no].xml"/>
<rsb:push item="output"/>

代碼實現部分,唯一的亮點就是調用了XMLDomSearch這個ops,掌握了它的調用,又如掌握了全世界:-)
如何正確調用XMLDOMSearch,請看下圖。
在這裏插入圖片描述

輸出結果如下:

<PURORDER>
 <CustomerId>0056</CustomerId>
 <ReferenceNumber>1070335099</ReferenceNumber>
 <PONumber>0476696888</PONumber>
 <BillAddress>Wayne Tech</BillAddress>
 <BillLine1>125 WayneHigh Road.</BillLine1>
 <BillLine2></BillLine2>
 <BillCity></BillCity>
 <BillState></BillState>
 <BillZip ></BillZip>
 <BillCountry></BillCountry>
 <ShipAddress>Wayne Tech Plant 1</ShipAddress>
 <ShipLine1>100 Wayne Ave.</ShipLine1>
 <ShipLine2></ShipLine2>
 <ShipCity>Chapel Hill</ShipCity>
 <ShipState>MX</ShipState>
 <ShipZip>27514</ShipZip>
 <ShipCountry>US</ShipCountry>
 <PURORDERLINEITEMS>
   <ItemQty>500000</ItemQty>     
   <ItemQtyUnit>EA</ItemQtyUnit>
   <ItemPrice>495</ItemPrice>
   <ItemPriceUnit>TP</ItemPriceUnit>
   <ItemVendorNo>422242224</ItemVendorNo>
   <ItemDesc>500,000 red widgets</ItemDesc>
   <DueDate></DueDate>
 </PURORDERLINEITEMS>
 <PURORDERLINEITEMS>
   <ItemQty>100</ItemQty>     
   <ItemQtyUnit>EA</ItemQtyUnit>
   <ItemPrice>395</ItemPrice>
   <ItemPriceUnit>HP</ItemPriceUnit>
   <ItemVendorNo>422242226</ItemVendorNo>
   <ItemDesc>100 blue widgets</ItemDesc>
   <DueDate></DueDate>
 </PURORDERLINEITEMS>
 <PURORDERLINEITEMS>
   <ItemQty>500</ItemQty>     
   <ItemQtyUnit>EA</ItemQtyUnit>
   <ItemPrice>210</ItemPrice>
   <ItemPriceUnit>TP</ItemPriceUnit>
   <ItemVendorNo>422201210</ItemVendorNo>
   <ItemDesc>AH-0310 red widgets</ItemDesc>
   <DueDate></DueDate>
 </PURORDERLINEITEMS>
 <PURORDERLINEITEMS>
   <ItemQty>150</ItemQty>     
   <ItemQtyUnit>EA</ItemQtyUnit>
   <ItemPrice>350</ItemPrice>
   <ItemPriceUnit>TP</ItemPriceUnit>
   <ItemVendorNo>422241452</ItemVendorNo>
   <ItemDesc>F-100 blue widgets</ItemDesc>
   <DueDate></DueDate>
 </PURORDERLINEITEMS>
 <PURORDERLINEITEMS>
   <ItemQty>500000</ItemQty>     
   <ItemQtyUnit>EA</ItemQtyUnit>
   <ItemPrice>495</ItemPrice>
   <ItemPriceUnit>TP</ItemPriceUnit>
   <ItemVendorNo>422244512</ItemVendorNo>
   <ItemDesc>HU-021 black widgets</ItemDesc>
   <DueDate></DueDate>
 </PURORDERLINEITEMS>
 <PURORDERLINEITEMS>
   <ItemQty>1500</ItemQty>     
   <ItemQtyUnit>EA</ItemQtyUnit>
   <ItemPrice>3000</ItemPrice>
   <ItemPriceUnit>HP</ItemPriceUnit>
   <ItemVendorNo>422241023</ItemVendorNo>
   <ItemDesc>100-20J widgets</ItemDesc>
   <DueDate></DueDate>
 </PURORDERLINEITEMS>
</PURORDER>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章