如何在IIB中处理开头含无效垃圾字符的XML文件?
在IIB中处理开头含无效垃圾字符的XML消息的解决方案
方法1:通过Compute节点的ESQL提取有效XML
将输入消息以BLOB/CHAR类型读取,跳过开头无效字符后截取XML主体,再解析为XML格式:
- 配置输入节点(如MQInput)的消息格式为
BLOB,禁止自动解析XML - 添加Compute节点,使用以下ESQL代码处理:
CREATE COMPUTE MODULE ExtractValidXML CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN -- 读取输入消息为CHAR类型(使用消息自带的CCSID) DECLARE inputMsg CHAR CAST(InputRoot.BLOB.BLOB AS CCSID InputRoot.Properties.CodedCharSetId); -- 定位XML根标签的起始位置(替换为你的实际根标签,如'<order>') DECLARE xmlStartPos INTEGER POSITION('<root>' IN inputMsg); IF xmlStartPos > 0 THEN -- 截取从根标签开始的有效XML字符串 DECLARE validXML CHAR SUBSTRING(inputMsg FROM xmlStartPos); -- 解析为XMLNSC格式并设置为输出 SET OutputRoot.XMLNSC = PARSE(validXML OPTIONS FolderBitStream CCSID InputRoot.Properties.CodedCharSetId); ELSE -- 未找到有效XML时抛出异常或路由到失败终端 THROW USER EXCEPTION MESSAGE 'No valid XML root tag detected'; END IF; RETURN TRUE; END; END MODULE;
方法2:使用JavaCompute节点处理字节流
适合更复杂的字符匹配场景,直接操作字节流定位XML起始点:
import com.ibm.broker.plugin.*; public class ExtractValidXML extends MbJavaComputeNode { public void evaluate(MbMessageAssembly inAssembly) throws MbException { MbOutputTerminal out = getOutputTerminal("out"); MbOutputTerminal fail = getOutputTerminal("failure"); MbMessage inMsg = inAssembly.getMessage(); MbMessage outMsg = new MbMessage(); MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, outMsg); try { // 获取输入消息字节数组 byte[] inputBytes = inMsg.getRootElement().getLastChild().getValue(); String inputStr = new String(inputBytes, inMsg.getMessageProperties().getCodedCharSetId()); // 查找第一个XML起始标签的位置 int xmlStartIdx = inputStr.indexOf("<root>"); if (xmlStartIdx != -1) { String validXml = inputStr.substring(xmlStartIdx); // 将有效XML写入输出消息的XMLNSC域 MbElement outRoot = outMsg.getRootElement(); outRoot.createElementAsLastChild(MbXMLNSC.PARSER_NAME, validXml.getBytes(inMsg.getMessageProperties().getCodedCharSetId())); out.propagate(outAssembly); } else { // 无有效XML时路由到失败终端 fail.propagate(inAssembly); } } catch (Exception e) { throw new MbException(this, "evaluate", "PROCESSING_ERROR", e.getMessage()); } finally { inMsg.clearMessage(); outMsg.clearMessage(); } } }
关键注意事项
- 编码一致性:必须使用消息属性中的
CodedCharSetId进行字符转换,避免乱码导致标签定位失败 - 灵活匹配:如果XML根标签不固定,可改为查找第一个
<字符,但需注意排除注释、DOCTYPE等非根标签的情况 - 异常处理:务必添加未找到有效XML的分支逻辑,将异常消息路由到失败终端,避免消息阻塞
内容的提问来源于stack exchange,提问作者abhishek p
相关产品推荐
相关产品推荐

