如何从ESQL

问题描述:

结论MQ消息删除非ASCII字符:如何从ESQL

出于某种原因,流量不会让我改变输入的消息域财产转换传入消息的BLOB节点所以我添加了一个重置内容描述符节点之前计算节点与来自接受答案的代码。在解析XML并为此消息创建XMLNSC子项的行上,我得到'字符:无效的接线格式收到'错误,因此我将该行取出并在计算节点后添加了另一个复位内容描述符节点代替。现在它解析并用空格替换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; 

UPDATE:

的消息是使用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

您不应该这样做,发件人有责任发送理智的XML。如果他们选择发送这些字符,他们必须使用'utf-8'编码并相应地设置'CCSID'(1208)。如果他们将编码设置为“iso-1”或“CCSID 819”,则解析器将正确拒绝这些字形。 – Stavr00

+0

尽管我完全同意这看起来不是一种选择。主管和同事的电子邮件在很大程度上被忽略。 – user1958756

+0

如何在BLOB中解析Broker中的消息? –

因此,在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的。

最后,我最好的祝愿是,多年来我一直在进行许多次的战斗,*纠正了“集成层”中的无效消息内容,而这一切都是它意味着要做的。

+0

不幸的是,它不喜欢试图解析ESQL中的BLOB,但这是另一个问题。你不应该感谢人,但是这超越了只是有益的 - 你给出的答案超出了最佳实践的范围。这是一个大胆的举动。 – user1958756

+0

你能提供一些你做过的更多细节吗?我已经用上面的方法解析了好几次消息,虽然我粘贴到SO后可能已经完成了整理,但我感到惊讶,它根本不起作用。 – TJA

+0

当然,编辑问题。 – user1958756