从XML文档(Redux)读取多个记录

2020-09-23 12:25发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


一年多以前,我问了这个问题:

https://archive.sap.com/discussions/thread/3818944

从本质上讲,如何将一个包含多个标签的XML文档读入(或拼合)到一个或多个输入流中? 我意识到适配器到流机制不允许一个适配器将输入发送到多个流,因此我对如何使用基于XML的适配器感到困惑。 文档中没有太多信息,没有可用的示例代码。

例如,一个XML文档如下所示:

 <?xml版本=" 1.0"编码=" utf-8"?> 
<协议> <端口/> 0123
HEAD123


1234
HEAD456





还有更多标签
如何定义一个ESP模式来接收所有数据? 我已经与发送此数据的人员进行了交谈,他们已经同意包括可能出现的每个标签,即使它们没有数据也是如此(如上所示)。 某些子标签名称在名称不同的父标签中使用时会重复(例如,上面的长度和标头)。

在上面提到的问题中,我正在使用XML文件适配器,建议是针对不同的模式多次读取同一文件。 那确实不是一个可行的解决方案。 对于这个项目,我将通过套接字适配器接收此数据,并且该数据将仅发送一次,因此我必须一次性获得所有数据。

请帮助!

谢谢

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


一年多以前,我问了这个问题:

https://archive.sap.com/discussions/thread/3818944

从本质上讲,如何将一个包含多个标签的XML文档读入(或拼合)到一个或多个输入流中? 我意识到适配器到流机制不允许一个适配器将输入发送到多个流,因此我对如何使用基于XML的适配器感到困惑。 文档中没有太多信息,没有可用的示例代码。

例如,一个XML文档如下所示:

 <?xml版本=" 1.0"编码=" utf-8"?> 
<协议> <端口/> 0123
HEAD123


1234
HEAD456





还有更多标签
如何定义一个ESP模式来接收所有数据? 我已经与发送此数据的人员进行了交谈,他们已经同意包括可能出现的每个标签,即使它们没有数据也是如此(如上所示)。 某些子标签名称在名称不同的父标签中使用时会重复(例如,上面的长度和标头)。

在上面提到的问题中,我正在使用XML文件适配器,建议是针对不同的模式多次读取同一文件。 那确实不是一个可行的解决方案。 对于这个项目,我将通过套接字适配器接收此数据,并且该数据将仅发送一次,因此我必须一次性获得所有数据。

请帮助!

谢谢

付费偷看设置
发送
8条回答
1楼 · 2020-09-23 13:01.采纳回答

为什么不愿接受SAP客户支持? 这个过程麻烦吗? 真的比在此论坛中发布难吗?

吹牛啤
2楼-- · 2020-09-23 12:50

嗨,杰夫,

我认为选择#1最有可能使用开箱即用的适配器。 如果我能找到发送XML的公司,将它压平到一个标签中,则所有数据都作为属性传递。 重复的名称可以与父标记的名称混合。 这对他们来说是很多工作,但是减少了自定义适配器所需的功能测试。

我不明白选择#2。 套接字事件XML适配器如何将事件路由到多个输入流? 即便如此,我也不知道是否要拆分事件,因为在生成响应时,稍后将不得不重新组装该事件。

与选择#3相同。 我需要在第三方应用程序和适配器之间进行某种预处理,以将数据打包在一起。 我正在尝试使进程数量尽可能少。

这不仅是入站问题。 ESP项目将基于许多业务规则的通过/失败生成响应,并将其发送回XML适配器,然后发送回第三方应用程序。

开始看起来我将必须构建一个自定义适配器,该适配器将入站XML扩展为单个ESP模式。 我已经编写了一些读/写XML的Java应用程序,所以我知道会发生什么,但是我担心它最终将被硬编码为特定的XML格式,并与第三方应用程序和ESP项目紧密结合。 如果数据格式更改,则意味着新的编码。

问题:其他用户如何处理? 大多数XML(和JSON)文档由组合在一起的不同数据结构组成。 这是它们目的不可或缺的一部分。

灬番茄
3楼-- · 2020-09-23 12:58

听起来并不是任何预先配置的适配器都能满足您的需要,但是您在这里有几种选择...

< p>让我们从重复元素的挑战开始。 这不仅仅是一个适配器问题,而是一个CCL模式问题。 如您所知,CCL对于每个输入流/窗口都需要一个固定的模式-即固定的列数。 因此,在每个"事件"中的列数都会变化的情况下,您有几种选择:

1。 用任何事件可以拥有的最大列数定义输入流。 您可以输入没有所有列的事件-缺少的列将只是" NULL"
2.定义多个输入流,每个输入流具有不同的架构,然后将事件"路由"到适当的输入流

3。 使用定界符将多个值打包在单个CCL字符串列中,然后在CCL中,您可以根据需要解析该字符串

现在到适配器了:大多数预构建适配器都基于适配器 框架。 适配器框架使您可以将传输模块,解析模块和ESP/SDS连接器模块以不同的组合进行组合,以实现所需的结果。 SDS和ESP附带了一组模块和一组预配置的适配器。 但是,您可以定义许多其他适配器而无需编写新的自定义模块,而只需将现有模块组合成不同的组合即可。

请参阅构建自定义适配器的指南。 感兴趣的模块 frameset.htm¤t_toc=/en/70/0dced65a83492d80e58a1a3930d2f3/plain.htm&node_id = 52"> XMLDoc解析器-可让您解析XML文档并将XML元素映射到CCL行/列

- ESPMultiStreamPublisher ,它允许单个适配器使用过滤器发布多个流,从而确定使用哪个过滤器 事件进入哪个输入流

最后,使用现有模块可能无法实现您想要的功能,在这种情况下,您可以考虑编写自定义解析模块。

对于适配器,适配器模块可能难以破解(尤其是在这些更复杂的模块周围),但是下载包中包含一些示例(位置因包而异- 听起来就像您在使用ESP。 在ESP安装目录中四处摸索,但应该在某个地方找到一个名为adapters的文件夹,如果进行深入研究,您将找到示例)
nice_wp
4楼-- · 2020-09-23 12:50

Robert,

感谢您(和Jeff的回复)。 我希望这不是解决方案(请参阅我对Jeff的答复)。 我有点害怕自定义适配器路由。 但是我从来没有建过一个。 也许没有我担心的那么糟糕。 同样,我需要输入和输出。 我将看一下自定义适配器的示例代码。 是否有希望提供基于套接字的适配器的源代码? 添加GD支持很难吗? 故障转移? 自动重启?

nice_wp
5楼-- · 2020-09-23 12:40

嗨,丹,

听起来您对'开箱即用'适配器的功能有不错的了解, 满足您当前正在处理的应用程序的要求。 在这种情况下,建议的方法是使用可用的SDK(C/C ++,C#.Net,Java)选择来构建自定义适配器。 使用自定义适配器,您将能够实现所需的XML解析逻辑,然后根据需要连接并发布到ESP项目中尽可能多的单独流中。

大简至美
6楼-- · 2020-09-23 12:50

是的,我想。

好的一面是,第三方同意重组其XML输出,使其仅使用一个标签并将所有数据置于属性中。 因此没有自定义适配器。

我将使用套接字适配器做进一步的测试,以查看上面列出的缺陷是否足够麻烦才能打开票证。

再次感谢Jeff和Robert的宝贵时间和专业知识。

天桥码农
7楼-- · 2020-09-23 12:50

再见,

我使用第三方的XML进行了一些测试,并且很难对其进行扁平化,因此也许我可以说服他们这样做并避免使用自定义适配器路由。

我使用的是xml文件适配器,而不是套接字适配器,因此它的行为可能有所不同,但是我对适配器的行为有一些疑问。 我正在运行ESP 5.1 SP12 PL03。

1。 每次启动适配器时,它都会发送一条记录,在所有列中都为空。 如果套接字适配器中的设置相同,则每个xml文档可能只有一条记录,实际上使输入数据加倍。 这是一个错误吗? 我应该在事件中举报吗?

2。 似乎只能在属性中指定数据。 嵌套标签不起作用。 (查看ID = 4的数据)

3。 正确定义的XML标记(我认为)未发送到ESP(请看ID = 3的数据)。 请注意属性后的右括号。

再次感谢您的建议和帮助。 确实帮助我清除了有关如何进行操作的想法。

ESP代码:

创建模式S_xmlIn(
     ID字符串
     端口字符串
     长度字符串,
     标头字符串
 );

 创建输入流xmlIn SCHEMA S_xmlIn;

 将ATTACH INPUT ADAPTER XML_IN TYPE toolkit_file_xmllist_input插入xmlIn
 性质
 dir ='C:/data',
 文件='tx1Attr.xml'
 ;
 

tx1Attr.xml

 <?xml version =" 1.0" encoding =" US-ASCII"?>
 
 
 
  
   4  <端口> 666  <长度> 0439  
00121

一周热门 更多>