具有多个根节点的 IIB 输出 XML

IIB output XML with multiple root nodes

问题

给定接收多条 XML 消息的 MQ 输入,我想输出相同的消息,但被分成(比方说)3 组。

例如输入(每行是输入队列中的一条新消息):

<In1/>
<In2><In2a/></In2>
<In3/>
<In4/>
<In5 test="test"/>
<In6/>

例如输出(每行是输出队列中的一条新消息):

<In1/><In2><In2a/></In2><In3/>
<In4/><In5 test="test"/><In6/>

之所以这样做,是为了对发送的消息进行批处理,以减少发送多条小消息的开销。

我试过的

我查看了 this article,这表明对于这种简单的场景,使用内置收集节点可能是一种选择。

我已经尝试创建 MQInput -> Collector -> MQOutput,但是 Collector node creates a special MessageCollection 对象并不是我想要的。

然后我想,好的,收集器将消息汇集在一起​​ - 现在我只需要使用 ESQL 创建一条新消息 - 但我似乎无法弄清楚 ESQL 来完成它。

我目前的尝试:

DECLARE collection REFERENCE TO InputRoot.Collection;
MOVE collection FIRSTCHILD NAME 'MessagesIn';

DECLARE I INTEGER 1;
CREATE LASTCHILD OF OutputRoot.XMLNSC TYPE Name NAME 'Test';
WHILE LASTMOVE(collection) DO
    SET OutputRoot.XMLNSC.Test.*[I] = collection.XMLNSC.*[>];           
    MOVE collection NEXTSIBLING;
    SET I = I + 1;
END WHILE;
    
RETURN TRUE;

虽然这可行,但这样做只是因为它创建了单个根“测试”,而我希望我的输出有效地具有多个根。

但是如果我删除 Test 文件夹,则会引发有关输出格式的错误,如下所示:

( ['GENERICROOT' : 0x3a6d0bc8]
  (0x01000000:Name  ):Properties = ( ['MQPROPERTYPARSER' : 0x422a14d8]
    (0x03000000:NameValue):MessageSet             = NULL
    (0x03000000:NameValue):MessageType            = NULL
    (0x03000000:NameValue):MessageFormat          = NULL
    (0x03000000:NameValue):Encoding               = NULL
    (0x03000000:NameValue):CodedCharSetId         = NULL
    (0x03000000:NameValue):Transactional          = NULL
    (0x03000000:NameValue):Persistence            = NULL
    (0x03000000:NameValue):CreationTime           = NULL
    (0x03000000:NameValue):ExpirationTime         = NULL
    (0x03000000:NameValue):Priority               = NULL
    (0x03000000:NameValue):ReplyIdentifier        = NULL
    (0x03000000:NameValue):ReplyProtocol          = 'UNKNOWN' (CHARACTER)
    (0x03000000:NameValue):Topic                  = NULL
    (0x03000000:NameValue):ContentType            = NULL
    (0x03000000:NameValue):IdentitySourceType     = NULL
    (0x03000000:NameValue):IdentitySourceToken    = NULL
    (0x03000000:NameValue):IdentitySourcePassword = NULL
    (0x03000000:NameValue):IdentitySourceIssuedBy = NULL
    (0x03000000:NameValue):IdentityMappedType     = NULL
    (0x03000000:NameValue):IdentityMappedToken    = NULL
    (0x03000000:NameValue):IdentityMappedPassword = NULL
    (0x03000000:NameValue):IdentityMappedIssuedBy = NULL
  )
  (0x01000000:Folder):XMLNSC     = ( ['xmlnsc' : 0x31d412c8]
    (0x01000000:Folder):In1  = 
    (0x01000000:Folder):In2  = (
      (0x01000000:Folder):In2a = 
    )
    (0x01000000:Folder):In3  = 
  )
)

错误信息如下:

        (0x03000000:NameValue):Text            = 'XML Writing Errors have occurred' (CHARACTER)
        (0x01000000:Name     ):ParserException = (
          (0x03000000:NameValue):File     = 'F:\build\slot1\S900_P\src\MTI\MTIforBroker\GenXmlParser4\ImbXMLNSCWriter.cpp' (CHARACTER)
          (0x03000000:NameValue):Line     = 976 (INTEGER)
          (0x03000000:NameValue):Function = 'ImbXMLNSCWriter::writeMisc' (CHARACTER)
          (0x03000000:NameValue):Type     = '' (CHARACTER)
          (0x03000000:NameValue):Name     = '' (CHARACTER)
          (0x03000000:NameValue):Label    = '' (CHARACTER)
          (0x03000000:NameValue):Catalog  = 'BIPmsgs' (CHARACTER)
          (0x03000000:NameValue):Severity = 3 (INTEGER)
          (0x03000000:NameValue):Number   = 5016 (INTEGER)
          (0x03000000:NameValue):Text     = 'Unexpected XML type at this point in document.' (CHARACTER)
          (0x01000000:Name     ):Insert   = (
            (0x03000000:NameValue):Type = 5 (INTEGER)
            (0x03000000:NameValue):Text = 'In2' (CHARACTER)
          )
          (0x01000000:Name     ):Insert   = (
            (0x03000000:NameValue):Type = 5 (INTEGER)
            (0x03000000:NameValue):Text = 'folderType' (CHARACTER)
          )

问题

问题的部分是:

  1. 是否有更好的方法来聚合这些消息?
  2. 如果根据 XMLNSC 作者的说法,拥有多个根元素是无效的,还有其他解决方法吗?将其视为 BLOB 而不是 XML,也许?

The reason for doing this, is in order to batch the messages for transmission, in order to reduce the overhead of sending multiple small messages.

为什么您认为发送多条小消息是个问题?您是否进行了性能测试来证实这一点?

If having multiple root elements is invalid according to the XMLNSC writer, is there another way around it?

XMLNSC writer尽量不写无效的XML文档,所以它总是拒绝输出两个根标签。单独使用 XMLNSC 编写器 .

永远不会成功

可以通过使用 ESQL ASBITSTREAM 函数预序列化 XML 文档来解决此限制。您需要使用 ESQL 字符串函数自行连接它们。

但是,您假设您的 XML 文档 永远不会 包含换行符。你不能确定这一点,我认为这是一件危险的事情。