Генерация XML с мэйнфреймом Cobol
Мне нужно создать XML-файл из сложной структуры COBOL (мейнфрейм). Я не могу использовать функцию XML GENERATE cobol, потому что дерево данных слишком велико, чтобы поместиться в WS (около 8 вложенных массивов, каждый из которых содержит около 75 вхождений по 30 байт), поэтому нет ни одного элемента группы, который можно передать в функцию генерации xml,
Единственный вариант, о котором я могу подумать, - это генерировать xml "вручную", проходя иерархию на уровне необходимых таблиц adabas по уровням и заполняя файл, проблема для меня в том, что я не знаю, как перейти файл снова каждый раз и "Nest" следующий узел.
Есть ли способ лучше?
Данные поступают из таблиц ADABAS, и я также могу работать с естественным, есть ли лучшее решение, использующее естественное? из того, что я знаю, естественный не позволяет вкладывать более 3-х уровней, что является проблемой для меня.
Спасибо!
3 ответа
Не могу дать однозначного ответа; Некоторые комментарии:
- Является ли одна большая структура XML единственным путем? Большинство утилит Xml будут бороться с этим видом монолитного XML.
- Решение для потоковой передачи XML будет работать лучше / будет более удобным, чем написание полной структуры XML за один раз.
- Вы смотрели на коммерческие утилиты, например, XML Thunder, из памяти есть и другие. Я не могу комментировать, насколько они хороши, сколько они стоят.
Я написал утилиту Cobol to XML на Java. Он берет файл данных Cobol + тетрадь Cobol и преобразует его в XM. Утилита позволяет вам определять Иерархию среди различных Cobol-Records, поэтому вместо использования вложенных массивов вы используете "вложенные" Cobol-Records. Моя утилита Cobol to XML может не соответствовать размеру ваших тетрадей. Но такую утилиту довольно легко написать.
Должно быть достаточно легко скопировать мою утилиту Cobol в Xml:
- Создание программы Cobol для написания Xml (в потоковом режиме) из тетради Cobol
- Напишите программу общего назначения Cobol File ==> Xml.
Для любого решения я бы использовал отформатированную версию Cobol-Copybook, например
- Карта полей, созданная компилятором Cobol.
- Перечень тетрадей File-Aid
- cb2xml при использовании скриптового языка для генерации программы Cobol
Этот ответ не связан с вашей проблемой, но он демонстрирует, что можно сгенерировать из тетради Cobol. В этом случае он сгенерировал:
- Текст-Кобол-тетрадь из двоичной тетради
- Код для преобразования двоичного индексированного файла в плоский текстовый файл
- Код VBA для генерации баз данных
- Код VBA для загрузки файла Cobol-Data в БД
Итак, две мысли:
- Пусть ваш код "сгенерирует" XML вручную, если это необходимо.
- Разбейте ваше дерево на поддеревья, если это возможно.
Интерфейс Redvers COBOL XML использует точку итерации и множественные вызовы подпрограммы генератора для очень больших и сложных тетрадей. Вы переместили бы исходный набор данных в тетрадь CALL, затем переместили следующий набор данных и снова CALL. Вывод XML, очевидно, будет очень большой строкой, но вы также можете выгружать ее управляемыми кусками.
Я только что сделал что-то подобное для клиента. Очевидно, я не могу опубликовать здесь их код, но, возможно, в общих чертах, что мы сделали...
Во-первых, мы создали структуру, подобную JSON: Natural X-Array Group, содержащую 3 поля:
nson (1:*) /* X-Array
level-number (I1)
tag-name (A) DYNAMIC
tag-value (A) DYNAMIC
(мы использовали -ve level-number для обозначения - 0:n - XML-атрибутов для предыдущего +ve уровня)
Чтобы заполнить X-массив, мы использовали область глобальных данных из естественной подпрограммы и естественных внешних подпрограмм (с использованием вызова по значению и дополнительных параметров) вместе с несколькими естественными функциями для типичных преобразований данных (например, упакованных переменных или переменных даты нанизывать)
В результате получился Natural Code, напоминающий XML, например:
perform XML-at 2 'node-name' /* ABSOLUTE Level
perform XML-this 'tag-name' 'tag-value' /* Relative Level
perform XML-this 'node-name' /* Relative Level
perform XML-next 'tag-name' 'tag-value' /* Relative Level
perform XML-prev 'tag-name' P3(<-17.123>) /* Relative Level & Function for (Pnn.3)
Затем мы отправили это через Natural-RPC в службу Java, которая построила из него XML.
(в нашем случае мы использовали серверную часть XML, но вы можете вернуть ее в Natural в переменной DYNAMIC)