db2 将XML转换为平面文件

jljoyd4f  于 2022-11-07  发布在  DB2
关注(0)|答案(3)|浏览(164)

我有一个需求,我必须从IFS中获取一个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的每个段都应该是平面文件中的一个记录。但任何段(如EmpAddressPreviousCompanyCompAddress)都可以重复多次。因此,平面文件中的顺序应该相同。
我确实想到了XML-INTO和XMLTABLE,但是我没有找到一个简单的解决方案。
请让我知道,如果有一个易于实施的解决方案。

w41d8nur

w41d8nur1#

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

anauzrmj

anauzrmj2#

我用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
v2g6jxz6

v2g6jxz63#

谢谢大家的宝贵意见!
我做的方法如下:
我创建了一个临时表,将XML中的所有元素作为字段。(每个段都有一个不同的键)。我将每个段写入一个平面文件(每个段和更高的段将被填充。其余的将为空)。现在,我写了一个RPG程序,它有多个光标用于重复的段,并进行分组。
所以首先RPG程序会读取最高段,然后下一级,用更高段的关键字读取该段,等等。。

相关问题