结论:
出于某种原因,流量不允许我通过更改输入节点的消息域属性将传入消息转换为BLOB,因此我添加了使用接受答案中的代码计算节点之前的重置内容描述符节点。在解析XML并为消息创建 XMLNSC Child 的行上,我收到了一个' CHARACTER:收到无效的有线格式'错误,所以我把这一行拿出来,并在计算节点之后添加了另一个重置内容描述符节点。现在它用空格解析并替换Unicode字符。所以现在它并没有崩溃。
以下是添加的计算节点的代码:
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
DECLARE NonPrintable BLOB X'0001020304050607080B0C0E0F101112131415161718191A1B1C1D1E1F7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF1F2F3F4F5F6F7F8F9FAFBFCFDFEFF';
DECLARE Printable BLOB X'20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020';
DECLARE Fixed BLOB TRANSLATE(InputRoot.BLOB.BLOB, NonPrintable, Printable);
SET OutputRoot = InputRoot;
SET OutputRoot.BLOB.BLOB = Fixed;
RETURN TRUE;
END;
更新:
使用XMLNSC将消息解析为XML。认为会导致问题,但似乎不是。
现在我正在使用PHP。我已经创建了一个插入遗留流的节点。这是相关代码:
class fixIncompetence {
function evaluate ($output_assembly,$input_assembly) {
$output_assembly->MRM = $input_assembly->MRM;
$output_assembly->MQMD = $input_assembly->MQMD;
$tmp = htmlentities($input_assembly->MRM->VALUE_TO_FIX, ENT_HTML5|ENT_SUBSTITUTE,'UTF-8');
if (!empty($tmp)) {
$output_assembly->MRM->VALUE_TO_FIX = $tmp;
}
// Ensure there are no null MRM fields. MessageBroker is strict.
foreach ($output_assembly->MRM as $key => $val) {
if (empty($val)) {
$output_assembly->MRM->$key = '';
}
}
}
}
现在我对只读消息有一个模糊的错误,但在此之前它也没有。
原始问题:
出于某种原因,我无法给MQ的发送者留下深刻的印象 智能引号,endashes,emdashes等消息使我们的XML崩溃 解析器。
我设法用SQL查询创建一个有效的解决方案,但它浪费了 资源太多了。这是我尝试的最后一件事,但它没有奏效 之一:
CREATE FUNCTION CLEAN(IN STR CHAR) RETURNS CHAR BEGIN SET STR = REPLACE('–',STR,'–'); SET STR = REPLACE('—',STR,'—'); SET STR = REPLACE('·',STR,'·'); SET STR = REPLACE('“',STR,'“'); SET STR = REPLACE('”',STR,'”'); SET STR = REPLACE('‘',STR,'&lsqo;'); SET STR = REPLACE('’',STR,'’'); SET STR = REPLACE('•',STR,'•'); SET STR = REPLACE('°',STR,'°'); RETURN STR; END;
正如你所看到的,我并不擅长这一点。我试过阅读 各种ESQL字符串函数没有太大成功。
答案 0 :(得分:2)
因此,在ESQL中,您可以使用TRANSLATE函数。
以下是我用来清理包含非ASCII低十六进制值的BLOB的片段,然后将其转换为可用的字符串。
您应该能够修改它以将不受欢迎的角色更改为更温和的东西。基本上,NonPrintable中的每个十六进制值都被转换为Printable中的位置等效值,在这种情况下总是一个完整的停止,即ASCII中的x'2E'。你需要让你的BLOB足够长,以覆盖所需的十六进制值范围。
DECLARE NonPrintable BLOB X'000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F';
DECLARE Printable BLOB X'2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E';
SET WorkBlob = TRANSLATE(WorkBlob, NonPrintable, Printable);
顺便说一下,如果只有带有无效字符的消息现在出现,那么我可能会在输入节点上指定BLOB,然后使用类似于下面的内容来调用XMLNSC解析器。
CREATE LASTCHILD OF OutputRoot DOMAIN 'XMLNSC'
PARSE(InputRoot.BLOB.BLOB CCSID InputRoot.Properties.CodedCharSetId ENCODING InputRoot.Properties.Encoding);
在异常终端接线的情况下,您可以在尝试重新分析之前纠正包含解析器破坏无效字符的任何消息的BLOB。
最后,我最好的祝福,因为我多年来经历过多次战斗,被迫纠正“整合层”中的无效消息内容,而这正是它的意图。