Преобразование XML в плоский файл - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть требование, при котором я должен получить XML-файл из IFS и поместить его в обычный файл.Плоский файл должен быть загружен точно так же, как данные 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 должен быть одной записью в плоском файле.Но любой сегмент (например, «EmpAddress», «PreviousCompany» или «CompAddress») может повторяться несколько раз.Поэтому плоский файл должен иметь его в том же порядке.

Я думал о XML-INTO так же хорошо, как и о XMLTABLE, но не смог найти легкого решения.Пожалуйста, дайте мне знать, если есть простое решение для этого.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Спасибо всем за ценные предложения!Я сделал это следующим образом: я создал временную таблицу со всеми элементами в XML как Fields. Имея эту временную таблицу, я знал, какой сегмент находится под каким сегментом (у каждого сегмента был отдельный ключ).Я записал каждый сегмент в плоский файл (каждый сегмент и более высокие сегменты для этого будут заполнены. Остальное будет нулевым) с использованием XMLTABLE.Теперь я написал RPG-программу с несколькими курсорами для повторяющихся сегментов и созданием группы By.Итак, сначала программа RPG прочитает Самый высокий сегмент, затем перейдет на один уровень вниз и прочитает этот сегмент с ключом верхнего сегмента и т. Д.

0 голосов
/ 04 декабря 2018

XML-INTO примерно так же легко, как и получается.Создайте структуру данных для получения данных, а затем обработайте данные из структуры данных любым удобным для вас способом.Ключ должен дать XML-INTO способ сообщить вам, сколько существует конструкций каждого цикла или есть ли пропущенные элементы.Вот пример, который может работать для вашего сотрудника 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

...