Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个根节点的IIB输出XML 问题_Xml_Ibm Integration Bus_Extended Sql - Fatal编程技术网

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

具有多个根节点的IIB输出XML 问题,xml,ibm-integration-bus,extended-sql,Xml,Ibm Integration Bus,Extended Sql,给定一个接收多个XML消息的MQ输入,我想输出相同的消息,但要分批分成(比如)3组 e、 g.输入(其中每行都是输入队列上的新消息): e、 g.输出(其中每行都是输出队列上的新消息): 这样做的原因是为了批量发送消息,以减少发送多个小消息的开销 我试过的 我已经看过了,这表明对于这样一个简单的场景,使用内置集合节点可能是一种选择 我尝试过创建MQInput->Collector->MQOutput,但是创建了一个特殊的对象,这不是我想要的 于是我想,好吧,收集器将消息汇集在一起——现在

给定一个接收多个XML消息的MQ输入,我想输出相同的消息,但要分批分成(比如)3组

e、 g.输入(其中每行都是输入队列上的新消息):


e、 g.输出(其中每行都是输出队列上的新消息):


这样做的原因是为了批量发送消息,以减少发送多个小消息的开销

我试过的 我已经看过了,这表明对于这样一个简单的场景,使用内置集合节点可能是一种选择

我尝试过创建MQInput->Collector->MQOutput,但是创建了一个特殊的对象,这不是我想要的

于是我想,好吧,收集器将消息汇集在一起——现在我只需要使用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”,而我希望我的输出有效地具有多个根

但是如果我删除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文档永远不会包含换行符。你不能肯定这一点,我认为这是一件危险的事情

    这样做的原因是为了批量发送消息,以减少发送多个小消息的开销

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

    如果根据XMLNSC编写器,拥有多个根元素是无效的,那么还有其他方法吗

    XMLNSC编写器尝试不编写无效的XML文档,因此它将始终拒绝输出两个根标记。单独使用XMLNSC编写器永远不会成功

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


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

    我可以问一下,您将如何使用它,因为它不是有效的xml。可能是,如果您考虑减少消息的数量,那么您可以为3条消息的每个组合生成一个固定宽度的有效负载或一个JSON,与XML相比,这3条消息是压缩格式。同样,这是在不知道您减少消息数量的动机的情况下进行的。这是为了网络传输(通过internet),因此批处理消息意味着我们不会每次都有协议头,这会使消息的大小增加一倍以上。事实上,我可能会将批处理分为10组,而不是3组-显示的消息只是一个示例。我要求消息保持XML格式,因此不能使用JSON——我仍在研究是否允许将消息包装在父根节点
    中;所以现在我被多重根所困扰。它被称为XML片段,而不是文档,对吗?在你的问题中,你已经知道了如何用一个根“Test”来包装,这样你就可以用“messages”来代替“Test”。不是吗?是的,任何一个根都可以——我的意思是,我的需求中是否允许它;我要问的是,由于它不是有效的xml,您将如何使用它。可能是,如果您考虑减少消息的数量,那么您可以为3条消息的每个组合生成一个固定宽度的有效负载或一个JSON,与XML相比,这3条消息是压缩格式。同样,这是在不知道您减少消息数量的动机的情况下进行的。这是为了网络传输(通过internet),因此批处理消息意味着我们不会每次都有协议头,这会使消息的大小增加一倍以上。事实上,我可能会将批处理分为10组,而不是3组-显示的消息只是一个示例。我要求消息保持XML格式,因此不能使用JSON——我仍在研究是否允许将消息包装在父根节点
    中;所以现在我被多重根所困扰。它被称为XML片段,而不是文档,对吗?在你的问题中,你已经知道了如何用一个根“Test”来包装,这样你就可以用“messages”来代替“Test”。不是吗?是的,任何一个根都可以——我的意思是,我的需求中是否允许它;不知道技术上是否可行