PI/ABAP无边界元素的代理映射处理ABAP中元素的text()值contentof。

2020-08-24 04:41发布

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

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


嗨,专家。

包含属性的重复元素的PI/ABAP代理映射-无法处理ABAP中顶级元素的text()内容。

SAP PI版本7.5 sp11。

我们在PI映射和ABAP代理中创建的结果结构方面存在问题。

在我们的消息映射的两侧都需要以下xsd。 我们只是在顶层进行映射,而在PI中测试映射时会遇到所有数据。

当我们生成代理时,它会创建一个表来表示消息元素。

表类型包含关联的属性(规则,严重性,原因和消息),但是关联元素的text()内容无处可去..在PI映射屏幕中,我们看到了文本,但是Proxy无处可寻 去。

一切都可以编译,但是当我们运行代理时,如果元素" Message"中包含任何文本(即其内容或值),则会引发异常–由于不满足Message元素文本的事实 从而使xml格式错误。

请参见下面的示例xml内容:高亮显示的文本导致异常。

作为一种解决方法,我们尝试在图形映射中将顶级" Message"元素映射到其关联的" message" 属性,然后将顶级Message元素的内容设置为null(在 下面的映射中的replacestring函数)。 我们希望将其应用于数组中Message元素的所有出现,但事实并非如此! 这样可以解决该异常,并且结果可以在消息结构表条目的代理和调用程序中看到,但是只有到那时,消息表的首次出现行的message属性中才能看到任何文本- 其余为空。 其他属性值在那里,但消息属性为空白。 因此看来,通过清除(使文本化)映射中的文本,它对于所有后续Message元素仍然保持清除状态。

任何人都可以建议我们如何更改输出XSD,以便Abap将创建正确的结构以允许Message元素的内容(text()),或者可以选择我们需要添加到映射中的内容以确保 相同的过程适用于所有出现的Message,而不仅仅是第一个。 谢谢

正在使用来自输出xsd后期映射的样本(对此生成的代理结果)。 预映射xsd没有message属性,我们希望元素中的文本值内容进入属性message

示例输出XML消息和数据...。突出显示的文本值是导致我们出现问题的原因

<消息部分="完整的RdSAP"规则="从完整的RdSAP数据集中丢失"严重性" 4"原因="缺少">"> 未定义日期区域

<消息部分=" Full RdSAP"规则="从完整的RdSAP数据集中丢失"严重性" 4"原因=" Missing"> 未定义地形类型

<消息部分="完整的RdSAP"规则="从完整的RdSAP数据集中丢失"严重性" 4"原因="缺少">"> 未定义仪表类型

0.5135

我们什么都不用替换Message元素的值,但这应该是在将元素值移动到属性之后

Abap结构将Message元素转换为表格,并且每个Message元素的text()内容值都没有位置,如果不清除它,则会在代理中收到异常,因为无法处理文本。/p>

消息行类型...

(74.8 kB)

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

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


嗨,专家。

包含属性的重复元素的PI/ABAP代理映射-无法处理ABAP中顶级元素的text()内容。

SAP PI版本7.5 sp11。

我们在PI映射和ABAP代理中创建的结果结构方面存在问题。

在我们的消息映射的两侧都需要以下xsd。 我们只是在顶层进行映射,而在PI中测试映射时会遇到所有数据。

当我们生成代理时,它会创建一个表来表示消息元素。

表类型包含关联的属性(规则,严重性,原因和消息),但是关联元素的text()内容无处可去..在PI映射屏幕中,我们看到了文本,但是Proxy无处可寻 去。

一切都可以编译,但是当我们运行代理时,如果元素" Message"中包含任何文本(即其内容或值),则会引发异常–由于不满足Message元素文本的事实 从而使xml格式错误。

请参见下面的示例xml内容:高亮显示的文本导致异常。

作为一种解决方法,我们尝试在图形映射中将顶级" Message"元素映射到其关联的" message" 属性,然后将顶级Message元素的内容设置为null(在 下面的映射中的replacestring函数)。 我们希望将其应用于数组中Message元素的所有出现,但事实并非如此! 这样可以解决该异常,并且结果可以在消息结构表条目的代理和调用程序中看到,但是只有到那时,消息表的首次出现行的message属性中才能看到任何文本- 其余为空。 其他属性值在那里,但消息属性为空白。 因此看来,通过清除(使文本化)映射中的文本,它对于所有后续Message元素仍然保持清除状态。

任何人都可以建议我们如何更改输出XSD,以便Abap将创建正确的结构以允许Message元素的内容(text()),或者可以选择我们需要添加到映射中的内容以确保 相同的过程适用于所有出现的Message,而不仅仅是第一个。 谢谢

正在使用来自输出xsd后期映射的样本(对此生成的代理结果)。 预映射xsd没有message属性,我们希望元素中的文本值内容进入属性message

示例输出XML消息和数据...。突出显示的文本值是导致我们出现问题的原因

<消息部分="完整的RdSAP"规则="从完整的RdSAP数据集中丢失"严重性" 4"原因="缺少">"> 未定义日期区域

<消息部分=" Full RdSAP"规则="从完整的RdSAP数据集中丢失"严重性" 4"原因=" Missing"> 未定义地形类型

<消息部分="完整的RdSAP"规则="从完整的RdSAP数据集中丢失"严重性" 4"原因="缺少">"> 未定义仪表类型

0.5135

我们什么都不用替换Message元素的值,但这应该是在将元素值移动到属性之后

Abap结构将Message元素转换为表格,并且每个Message元素的text()内容值都没有位置,如果不清除它,则会在代理中收到异常,因为无法处理文本。/p>

消息行类型...

(74.8 kB)
付费偷看设置
发送
11条回答
Climb_Ma
1楼-- · 2020-08-24 05:35

我结合了Evgeniy的建议,并相应地更改了目标xsd,但是代理中的结构没有任何改变。 除非我们将其移动到映射中的属性,否则消息元素内容文本仍然无处可去。 我们要做的就是将完整的QualityDocument内容移至目标消息,然后处理通过代理启动接口的调用程序中的内容。但是,如果我们使用目标xsd进行操作,那么abap代理将无处提供 解释目标xsd以容纳Message元素的节点文本,因此在运行接口时会引发异常。

我已经在消息级别重新映射,并删除了到属性等的映射,如您所见,在消息映射中,它工作正常。 我们只希望能够以某种方式在abap代理中选择突出显示的节点文本,但是它并没有提供任何放置它的地方! 这就是为什么我们在确实不需要时尝试解决它的原因。 谁能建议我们在xsd中可以做些什么,以使Message元素的节点文本在代理中生成消息结构时能够存储在ABAP中? 或者,我们如何将Message元素原始映射到message属性,然后清除mMessage elemnt中的节点文本可用于所有Message Element发生,而不仅是第一次发生

消息映射测试。 结果如下

,如果我们不清除节点文本,这是从abap代理获得的新异常...

ABAPP代理结构,用于保存响应消息

DafaDDDa
2楼-- · 2020-08-24 05:31

大家好。 抱歉,叶夫根尼(Evgeniy)绝对正确,您的解决方案解决了我们的问题。 看来,即使我们更改了xsd并重新激活了所有内容,该代理仍在使用旧结构。 我们重新创建了代理,它选择了新的代理,并在"消息"表中为我们提供了一个"内容"列,其中的"元素"文本就是其中的内容。 非常感谢你。 如果我想提出进一步的问题,可以在这里提出,还是需要创建一个新帖子? 这是相关的-我们需要知道如何设置参数以保存需要在通信通道中传递的令牌-并且由于再次缺乏知识,我们不确定是否需要在传入消息结构中添加元素

派大星 ヾ
3楼-- · 2020-08-24 05:45

hi。

从代理中,我们可以在CC中进行xpath到,或者是否还需要将该元素添加到映射的另一端。

详细信息如下。 理想情况下,我们只使用OAuth请求承载令牌,然后在通信通道中进行设置,但是正如您将在下面看到的那样,我们无法使其正常工作。 我们在此接口的新版本上的当前位置是,调用程序将首先调用一个接口以获取令牌,然后调用下面的主接口,以在Proxy的源消息中传递令牌,然后使用该接口设置参数p_token 。

当前,我们有一个工作的同步PI接口,该接口使用REST适配器将JSON消息发送到外部API并以xml格式接收响应(我们在尝试处理JSON响应时遇到了麻烦)。 外部API需要使用承载令牌来验证请求,目前我们已将其硬编码到适配器中,并且已成功作为HTTP标头成功传递给该API以验证请求。

当前请求消息映射如下所示。 它将xml结构映射到单个字段中,然后在REST适配器中将其转换为JSON,如下所示。

映射:-

REST适配器:-

我们无法解决的最后一个问题是动态传递不记名令牌。 据我们所知,我们有2个选项可以执行此操作。 理想情况下,我们会使用(看似)简单的选项1,但我们同时尝试了两种方法,但都无法使用。

选项1 –在REST适配器中使用"使用OAuth进行授权"功能。

我尝试了以下操作(某些字段已更改为匿名化),适配器中的其他选项卡与上面相同:-

我们可以调用API以在Postman应用程序中获取令牌,而这只需要用户名和密码即可。 出于某种原因,适配器具有两组用户名和密码,并且两者都是必填项。 我们找到了一个博客,建议在两者中都添加相同的详细信息。

选项2 –单独获取令牌,并通过代理/肥皂通道传递给PI,然后在模式变量替换中获取令牌,然后填充Http标头。 适配器设置如下:-

我们尝试了各种选择,但没有设法使它起作用。 我们认为需要在消息映射中的目标消息中指定参数,因此我们尝试了–请参见下面的映射。

但是,该接口失败了,并且在消息监视器中,它没有为JSON有效负载创建条目。 错误:-

我们也尝试了在目标中没有'token'元素的情况,但是在这里我们得到了授权错误:

我们希望这是因为目标消息中没有名为token的元素,并且Pattern Variable Replacement无法为其搜索inxml字符串??? 即使可能,由于某种原因,我们也会在令牌的开头加上"![CDATA [",在末尾加上"]",因此无论如何还是无效的。

我们想知道是否有任何方法可以在通道中搜索inxml字符串以提取令牌。 或者,如果我们在目标消息中将令牌作为单独的元素包括在内,则可以通过一种方式在读取令牌后将其删除以设置模式变量替换参数。

昨天在动态配置上看到了一个博客,该博客使用java读取参数等,但不确定是否需要合并。 如果我们可以在工作中得到第一个选择,那么我们就不需要做任何事情。

最后-在sxmb_moni,PI Message Monitor和xpi Inspector中,我们似乎看不到任何消息中的p_token内容。

槿木_熙
4楼-- · 2020-08-24 05:42

嗨-有人可以就上述内容提供建议吗?

huskylover
5楼-- · 2020-08-24 05:24

嗨,大卫!

我建议将令牌放入动态配置中(例如,在消息映射中使用UDF),然后在REST Receiver通道中进一步从DC取回该值并将其用于Value中 HTTP标头的模式。

关于此,Evgeniy。

一周热门 更多>