2016-05-17 49 views
0

結論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中的消息? –

回答

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的。

最後,我最好的祝願是,多年來我一直在進行許多次的戰鬥,被迫糾正了「集成層」中的無效消息內容,而這一切都是它意味着要做的。

+0

不幸的是,它不喜歡試圖解析ESQL中的BLOB,但這是另一個問題。你不應該感謝人,但是這超越了只是有益的 - 你給出的答案超出了最佳實踐的範圍。這是一個大膽的舉動。 – user1958756

+0

你能提供一些你做過的更多細節嗎?我已經用上面的方法解析了好幾次消息,雖然我粘貼到SO後可能已經完成了整理,但我感到驚訝,它根本不起作用。 – TJA

+0

當然,編輯問題。 – user1958756