将XML转换为平面文件

时间:2018-12-02 08:31:37

标签: db2 ibm-midrange rpgle

我有一个要求,我必须从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,但是我没有一个简单的解决方案。 请让我知道是否有一个易于实现的解决方案。

3 个答案:

答案 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)

我已经尝试过使用 AWKsed。代码如下:

#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