RPGLE中XML-INTO读取XML至数据结构失败问题求助
RPG读取XML到数据结构失败:子字段提示“Identifier does not exist”
问题现象
首次开发RPG程序读取XML数据至数据结构,但数据无法存入DS,查看子字段时提示“Identifier does not exist”。
示例XML片段
<?xml version="1.0" encoding="ISO-8859-1"?> <PRINTING> <HDR CW_DEPT_CD="736" CW_FILE_ID="W105B22355001" CW_UNIT_CD="D736" BANK_ACCT_CD="GA" PYMT_DT="12/12/2022" PROC_DT="12/12/2022" CHK_FRMT="GENZ" CHK_FRMT_DSCR="Generic Z-Fold" DISB_CAT="SAM" DISB_CAT_DSCR="Sealed Agency Mailed" DISB_HDLG_CD="null" DISB_HDLG_DSCR="null" STD_TXT="null" BANK_ACCN_NO="936836402" BANK_NO="083000137" DEPT_NM="Department For Community Based Services" UNIT_NM="Department for Community Based Services" PERMIT_NO="null" CNTAC_CD="76" EXTR_AD_1="ATTN: DAFM/TWIST" EXTR_AD_2="275 East Main Street 3W-C" EXTR_AD_3="null" EXTR_CITY="Frankfort" EXTR_ST="KY" ST_NM="null" EXTR_ZIP="40621" EXTR_CTRY="null" EXTR_EMAIL_AD="null" PH_NO="502-564-3427" PH_EXT="null" FAX_NO="null" /> </PRINTING>
程序代码片段
dcl-ds HDR DIM(10) Qualified; CW_DEPT_CD char(4); CW_FILE_ID char(20); CW_UNIT_CD char(4); BANK_ACCT_CD char(4); ...more fields dcl-ds PYMT_LINE; LN_NO char(6); VEN_CUST_CD char(20); LGL_NM char(60); ... more fields end-ds PYMT_LINE; end-ds HDR; Eval options = 'path=PRINTING/HDR/PYMT_LINE + case=any + allowextra=yes + allowmissing=yes + doc=file + datasubf=value'; xml-into HDR %XML(Filename:options);
问题分析与修正方案
核心问题点
- 数据结构与XML层级不匹配:XML中
<HDR>是<PRINTING>的直接子元素,且所有数据以属性形式存在;但代码中HDRDS下嵌套了PYMT_LINE子DS,而XML中不存在<PYMT_LINE>子节点,导致结构映射失败。 - Path参数错误:当前
path=PRINTING/HDR/PYMT_LINE指向不存在的节点,xml-into无法找到对应数据进行赋值。 - 未指定属性处理:XML中
<HDR>的内容是属性(key-value形式),代码未添加attr=yes参数,导致xml-into无法识别属性字段。
修正后的代码示例
// 调整DS层级,匹配XML结构:PRINTING包含HDR数组 dcl-ds PRINTING Qualified; dcl-ds HDR DIM(10) Qualified; CW_DEPT_CD char(4); CW_FILE_ID char(20); CW_UNIT_CD char(4); BANK_ACCT_CD char(4); // 补充其他与XML属性对应的字段 PYMT_DT char(10); PROC_DT char(10); // ... 剩余字段 end-ds HDR; end-ds PRINTING; // 调整options:添加attr=yes处理属性,修正path指向正确的根节点 Eval options = 'path=PRINTING + case=any + allowextra=yes + allowmissing=yes + doc=file + attr=yes'; xml-into PRINTING %XML(Filename:options);
关键说明
- 若XML中存在
<PYMT_LINE>节点(未在当前片段中展示),需将PYMT_LINEDS定义在与XML对应的层级(例如作为<PRINTING>的子元素),而非嵌套在HDR下。 - 移除代码中与XML结构不匹配的
PYMT_LINE嵌套DS(若XML中无对应节点),避免访问不存在的子字段时触发“Identifier does not exist”错误。 - 通过
attr=yes参数告知xml-into处理XML属性,确保属性值能正确映射到DS字段。
内容的提问来源于stack exchange,提问作者Jody
相关产品推荐
相关产品推荐

