xml - 具有多个根节点的 IIB 输出 XML
问题描述
问题
给定一个接收多个 XML 消息的 MQ 输入,我想输出相同的消息,但将它们分批处理(比如)3 组。
例如输入(其中每一行是输入队列中的一条新消息):
<In1/>
<In2><In2a/></In2>
<In3/>
<In4/>
<In5 test="test"/>
<In6/>
例如输出(每行是输出队列上的一条新消息):
<In1/><In2><In2a/></In2><In3/>
<In4/><In5 test="test"/><In6/>
这样做的原因是为了将消息进行批处理,以减少发送多个小消息的开销。
我试过的
我看过这篇文章,它表明使用内置集合节点可能是这种简单场景的一种选择。
我尝试创建 MQInput -> Collector -> MQOutput,但Collector 节点创建了一个特殊的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)
)
问题
问题的部分是:
- 有没有更好的方法来聚合这些消息?
- 如果根据 XMLNSC 编写器,具有多个根元素是无效的,还有其他方法吗?将其视为 BLOB 而不是 XML,也许?
解决方案
这样做的原因是为了将消息进行批处理,以减少发送多个小消息的开销。
为什么你认为发送多条小消息是个问题?您是否进行了性能测试以确认这一点?
如果根据 XMLNSC 编写器,具有多个根元素是无效的,还有其他方法吗?
XMLNSC 编写器尽量不编写无效的 XML 文档,因此它总是拒绝输出两个根标记。单独使用 XMLNSC 编写器永远不会成功。
您可以通过使用 ESQL ASBITSTREAM 函数预序列化 XML 文档来解决此限制。您需要使用 ESQL 字符串函数自己连接它们。
但是,您假设您的 XML 文档永远不会包含换行符。你不能确定这一点,我认为这是一件危险的事情。
推荐阅读
- python - 尝试使用 python 在 Jupyter Notebook 中读取多个 .csv 文件时出错
- c# - 我的 c# 控制台应用程序不允许带有 Console.ReadLine() 的变量接收用户输入,而是从 1 向上计数
- python - Groupby 根据以前可用值和下一个可用值的平均值填充数据框中的缺失值
- gtk - 如何在 GTK Iconview 中垂直列出项目?
- javascript - localhost express mongodb server,fetch request到localhost返回400状态
- php - 根据下拉选择格式化用户文本
- python - Flask render_template 无法显示引用的模板
- selenium - 如何从机器人框架中的命令行参数获取测试用例传递中的变量
- javascript - 如何确定所选文本中是否有换行符
- flutter - 自定义 IBM Watson Visual Recognition 服务与 Flutter/Dart 的集成