結論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字符串函數,但沒有取得多大成功。
您不應該這樣做,發件人有責任發送理智的XML。如果他們選擇發送這些字符,他們必須使用'utf-8'編碼並相應地設置'CCSID'(1208)。如果他們將編碼設置爲「iso-1」或「CCSID 819」,則解析器將正確拒絕這些字形。 – Stavr00
儘管我完全同意這看起來不是一種選擇。主管和同事的電子郵件在很大程度上被忽略。 – user1958756
如何在BLOB中解析Broker中的消息? –