我有一个要求,我必须从IFS获取XML文件并将其放到平面文件中。 平面文件应完全按照XML数据加载 例如,如果XML是
<Employee>
<FirstName>JIM</FirstName>
<LastName>SMITH</LastName>
<EmpAddress>
<StreetName>DARTMOUTH WAY</StreetName>
<STATE>OHIO</STATE>
</EmpAddress>
<EmpAddress>
<StreetName>SouthRidge Road</StreetName>
<STATE>WA</STATE>
</EmpAddress>
<PreviousCompany>
<CompName>DELL</CompName>
<CompAddress>
<StreetName>Road123</StreetName>
<STATE>WA</STATE>
</CompAddress>
<PreviousCompany>
<Employee>
然后将flt文件数据保存为
JIM SMITH
DARTMOUTH WAY OHIO
SouthRidge Road WA
DELL
Road123 WA
因此,基本上,XML的每个段都应该是平面File中的单个记录。但是任何段(例如“ EmpAddress”或“ PreviousCompany”或“ CompAddress”)都可以重复多次。因此,平面文件应具有相同的顺序。
我确实想到了XML-INTO和XMLTABLE,但是我没有一个简单的解决方案。 请让我知道是否有一个易于实现的解决方案。
答案 0 :(得分:0)
XML-INTO
简直易如反掌。建立一个数据结构以接收数据,然后以所需的任何方式从数据结构中处理数据。关键是给XML-INTO
一种方法来告诉您每个循环构造中有多少个,或者是否缺少元素。这是一个适用于您的Employee XML的示例:
// v7.3+
dcl-ds Employee Qualified;
FirstName Varchar(64);
LastName Varchar(64);
dcl-ds EmpAddress Qualified Dim(10);
StreetName Varchar(64);
State Varchar(32);
end-ds;
countEmpAddress Int(10);
dcl-ds PreviousCompany Qualified Dim(10);
CompanyName Varchar(64);
dcl-ds CompAddress Qualified Dim(10);
StreetName Varchar(64);
State Varchar(64);
end-ds;
countCompAddress Int(10);
end-ds;
countPreviousCompany Int(10);
end-ds;
// Pre v7.3
dcl-ds Employee Qualified;
FirstName Varchar(64);
LastName Varchar(64);
EmpAddress LikeDs(address_t) Dim(10);
countEmpAddress Int(10);
PreviousCompany LikeDs(company_t) Dim(10);
countPreviousCompany Int(10);
end-ds;
dcl-ds company_t Qualified Template;
CompanyName Varchar(64);
CompAddress LikeDs(address_t) Dim(10);
countCompAddress Int(10);
end-ds;
dcl-ds address_t Qualified Template;
StreetName Varchar(64);
State Varchar(64);
end-ds;
要使用XML-INTO
将数据加载到此结构中,只需使用:
xml-into Employee %xml('employee.xml': 'doc=file countprefix=count +
case=any allowmissing=yes');
更多信息可以在以下IBM文档中找到: https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/rzasd/allowmissopt.htm
答案 1 :(得分:0)
感谢所有宝贵的建议! 我的方法如下: 我创建了一个临时表,其中包含XML中的所有元素作为字段。通过拥有此临时表,我知道哪个分段位于哪个分段下(每个分段都有一个不同的键)。我使用XMLTABLE将每个段写到一个平面文件(每个段和较高的段将被填充,其余段为Null)。现在,我编写了一个RPG程序,其中有多个游标用于重复的段并进行分组依据。 因此,首先,RPG程序将读取“最高”段,然后下一层并使用较高段的键读取该段,依此类推。
答案 2 :(得分:0)
我已经尝试过使用 AWK
和 sed
。代码如下:
#Removing blank line from the actual file using sed.
sed -r '/^\s*$/d' Employee >Employee1
Employee.awk
BEGIN { FS ="[></]";RS ="\n\n"; OFS =""}
$0 ~ search {print $5 "\t"$10,"\n"$17 "\t" $22,"\n"$32 "\t" $37,"\n"$47,"\n"$54 "\t" $59}
awk -f Employee.awk Employee1
输出:
JIM SMITH
DARTMOUTH WAY OHIO
SouthRidge Road WA
DELL
Road123 WA