用cobol主机生成xml

Posted

技术标签:

【中文标题】用cobol主机生成xml【英文标题】:Generate xml with cobol mainframe 【发布时间】:2016-08-24 13:22:28 【问题描述】:

我需要从复杂的 COBOL 结构(大型机)生成 xml 文件。 我不能使用 XML GENERATE cobol 函数,因为数据树太大而无法放入 W-S(大约 8 个嵌套数组,每个数组大约出现 75 个 30 字节), 所以没有一个组项可以传递给 xml 生成函数。

我能想到的唯一选择是通过逐级遍历所需 adabas 表的层次结构并填充文件来“手动”生成 xml, 这个选项对我来说的问题是我不知道如何每次都再次检查文件并“嵌套”下一个节点。

有没有更好的方法?

数据来自 ADABAS 表,我也可以使用自然表,是否有更好的使用自然表的解决方案?据我所知,自然不允许嵌套超过 3 层,这对我来说是个问题。

谢谢!

【问题讨论】:

您最好更好地说明您的数据。除了名称之外,您没有描述嵌套结构。 IBM COBOL 6.1 将 Working-Storage 限制为 2,147,483,646 字节,单个 01 级别可以是 999,999,999 字节。在 IBM COBOL 4.2 中,这些限制都是 134,217,727 字节。您确定您拥有超过 128 兆字节的数据吗? 嗨,是的,我们正在使用 134,217,727 字节版本。而且我确信我的数据更多,我收到一个编译错误,说它大于 134,217,727。 (我正在建一棵树,虽然里面要存储的数据可能不到128mb,但结构必须符合最坏的情况,而且超出了限制...... . . . . . 比尔,xml应该代表一棵树,最多8层,每个节点都有自己的属性,树代表公司的层次结构。谢谢 1.您需要提供您的 Adabas 文件的描述和明显分层递归查询的逻辑,否则不可能提出任何建议。 2. 我会质疑将这么多数据放在单个 XML 文档中的设计。如果您解决了 XML 生成问题,您(或其他人)将立即面临处理这个怪物的问题。 您将如何从程序中获取数据?您知道记录大小的限制,不是吗? 【参考方案1】:

我无法给出肯定的答案; 一些cmets:

一个大的 XML 结构是唯一的出路吗???大多数 Xml 实用程序都难以应对这种单一的 XML。 XML 流解决方案将比一次性编写完整的 XML 结构更好/更易于维护。 您是否查看过商业公用事业,例如XML Thunder,根据记忆还有其他人。我无法评论它们的价格有多好。

我用 Java 写了一个Cobol to XML utility。它需要一个 Cobol 数据文件 + 一个 Cobol Copybook 并将其转换为 XM。该实用程序允许您在不同的 Cobol-Records 之间定义一个 Hierarchy,因此使用“嵌套”Cobol-Records 代替嵌套数组。我的Cobol to XML utility 可能会为你的字帖的大小而苦恼。但是这种实用程序相当容易编写。


通过

复制我的 Cobol 到 Xml 实用程序应该相当容易 生成一个 Cobol 程序以从 Cobol Copybook 编写 Xml(以流式方式) 编写通用 Cobol 文件 ==> Xml 程序。

对于任何一种解决方案,我都会使用 Cobol-Copybook 的 格式化 版本,例如

由 Cobol 编译器生成的字段映射。 文件辅助文案列表 cb2xml 如果使用脚本语言生成 Cobol 程序

此answer 与您的问题无关,但它确实演示了可以从 Cobol Copybook 生成的内容。在这种情况下,他生成:

来自二进制抄本的文本-Cobol-Copybook 将二进制索引文件转换为纯文本文件的代码 生成数据库的 VBA 代码 将 Cobol-Data 文件加载到 DB 中的 VBA 代码

【讨论】:

【参考方案2】:

所以有两个想法:

如有必要,让您的代码“手动生成”XML。 如果可能,将树分解为子树。

【讨论】:

我不能破坏树,因为结构必须是一个整体。所以可能“手工生成”是唯一的选择。但是这样做的正确方法是什么?一份文件?如果是这样,那么我如何在文件中间添加行-我认为它不可能..如果我应该构建一个巨大的字符串'我如何在字符串中间实现数据?【参考方案3】:

Redvers COBOL XML 接口使用迭代点和对生成器子例程的多次调用来处理非常大和复杂的字帖。您需要将一组初始数据移动到字帖 CALL,然后移动下一组数据并再次 CALL。 XML 输出显然将是一个非常大的字符串,但您也可以将其卸载为可管理的块。

【讨论】:

【参考方案4】:

我刚刚为客户做了类似的事情。显然我不能在这里发布他们的代码,但也许是我们所做的概要......

首先,我们创建了一个类似 JSON 的结构:一个包含 3 个字段的 Natural X-Array Group:

nson         (1:*)  /* X-Array
level-number (I1)
tag-name     (A) DYNAMIC
tag-value    (A) DYNAMIC

(我们使用 -ve level-number 来表示 - 0:n - XML-Attributes 用于前面的 +ve 级别)

为了填充 X 数组,我们使用了来自自然子程序和自然外部子例程(使用按值调用和可选参数)的全局数据区域以及一些用于典型数据转换的自然函数(例如打包或日期变量到字符串)

结果是类似于 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 服务器端,但您可以在 DYNAMIC 变量中将其返回给 Natural)

【讨论】:

以上是关于用cobol主机生成xml的主要内容,如果未能解决你的问题,请参考以下文章

你如何为 Cobol 字帖生成 java~jrecord 代码

COBOL--01--基础

COBOL--01--基础

COBOL--03--案例2cobol转hql

COBOL--03--案例2cobol转hql

COBOL--02--案例1