使用 XMLNSC 解析器处理消息

XMLNSC 域是 XMLNS 域的扩展,而 XMLNS 域是原始 XML 域的扩展。

XMLNS 域增加了名称空间支持。新的 XMLNSC 域构建压缩程度更高的树,这样,在处理大型消息时就会使用较少的内存。添加了一个新域,以便不会影响现有的应用程序。

消息树结构

XMLNSC 解析器使用一个“名称-值”元素来表示标记文本,而不象 XMLXMLNS 解析器那样使用分开的名称元素和值元素,因此它对树的压缩程度更高。请参阅以下消息:
    <Folder1>
        <Folder2 Attribute1='AttributeValue1'>
            <Field1><Value1></Field1>
            <Field2 Attribute2='AttributeValue2'><Value2></Field2>
        </Folder2>
    </Folder1>

XMLNSC 域中,这由两个名称元素(Folder1Folder2)以及四个“名称-值”元素(即,Attribute1Field1Field2Attribute2)表示。

更新开始XMLXMLNS 域的不同之处在于两个字段(Field1Field2),更新结束它们都由带有子值元素的名称元素来表示。可能看似并无大的差别,但消息通常具有许多这样的叶字段;例如:
    <Folder1>
        <Folder2>
            <Field1><Value1></Field1>
            <Field2><Value2></Field2>
            ....
            <Field100><Value100></Field100>
        </Folder2>
    </Folder1>

在这种情况下,XMLNSC 解析器通过两个名称和 100 个“名称-值”元素表示消息,而 XMLXMLNS 解析器将使用 102 个名称元素和 100 个值元素加上额外的 103 个值元素来表示格式化消息中的隐含空格。

更新开始XMLXMLNS 域在每个文件夹或字段的结束和开始之间为空白格式的字符创建“名称-值”元素。这些空格元素具有 XML 文档格式中使用的空格、跳格符、换行符或其他字符的一个空名称和值。这些元素没有价值,因此,可以废弃它们以提高压缩率。 同样,缺省行为是废弃输入流中的所有 XML 处理指令和注释,且在压缩域树中不创建元素。更新结束

属性和标记文本

由于属性和标记文本都由“名称-值”元素表示,因此它们通过是否使用元素类型来区分。如果未指定类型,则假定是标记文本。因此,上述第一个示例消息可由 SQL 语句生成:
    SET Origin.Folder1.Folder2.(XMLNSC.Attribute)Attribute1 =
       'AttributeValue1';
    SET Origin.Folder1.Folder2.Field1 = ‘Value1’;
    SET Origin.Folder1.Folder2.(XMLNSC.Attribute)Attribute2 =
       'AttributeValue2';
    SET Origin.Folder1.Folder2.Field2 = ‘Value2’;

尽管前面的 ESQL 看上去几乎与 XML 解析器使用的语句相同,但请特别注意,类型常量是属于 XMLNSC 解析器的。由于名称类似的常量(例如,XML.Attribute)具有不同的值,因此使用属于其他解析器(例如,XML)的常量会导致意外的结果。

更新开始要创建属性,请在 XMLNSC 域中定义以下常量:
   XMLNSC.SingleAttribute   XMLNSC.DoubleAttribute
更新结束
更新开始要选择属性,请在 XMLNSC 域中定义以下常量:
   XMLNSC.Attribute
更新结束
更新开始考虑以下 XML 输入消息:
    <Folder1 Item='ValueA'>
        <Item>Value1</Item>
    </Folder1>
更新结束
更新开始要明确指定 Folder01 中用作属性名和字段名的 Item 名称,可以使用以下 ESQL:
    SET ItemAttributeValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Attribute)Item;
    SET ItemFieldValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Field)Item;
更新结束

此方法比将 Folder1 用作数组下标更好,因为即使输入流中没有属性,它也不会受到影响。

处理混合文本

更新开始缺省情况下,会废弃混合文本,因为它只包含一些空格,并不表示任何含义。更新结束

但是,还提供了以下方式:解析时,在开始和结束标记(即 open->openclose->closeclose->open)之间更新开始出现的任何文本以单个未命名的 Value 元素表示。更新结束 值元素类型支持 PCDATACDATA 及混合类型,即前两种类型的混合。

仍然没有与值的获取和设置相关的特殊语法元素行为。Value 元素只能通过显式访问从 SQL 进行访问。因此提供了以下额外常量:
   XMLNSC.Value
   XMLNSC.PCDataValue
   XMLNSC.CDataValue
   XMLNSC.HybridValue
更新开始该方式由所有消息解析节点上的“XMLNSC 解析器选项”属性对话框导航器中的混合内容保留方式的设置控制。对于使用消息选项的程序化控制,提供了以下常量:更新结束
   XMLNSC.MixedContentRetainNone = 0x0000000000000000
   XMLNSC.MixedContentRetainAll = 0x0001000000000000
可以在 SQL CREATE 语句(PARSE 部分)和ASBITSTREAM 函数Option 子句中使用这些常量。例如:
   DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS
   XMLNSC.MixedContentRetainAll);
   ...
   CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS
   XMLNSC.MixedContentRetainNone);

处理注释

缺省情况下,会废弃注释,因为它们只是一些毫无意义的辅助信息。

更新开始但是,还提供了以下方式:在解析时,文档(而不是文档描述自身)中出现的任何注释都用“名称-值”元素和名称 Comment 表示。因此提供了以下额外常量。
   XMLNSC.Comment
更新结束
更新开始该方式由所有消息解析节点上的“XMLNSC 解析器选项”属性对话框导航器中的注释保留方式的设置控制。对于使用消息选项的程序化控制,提供了以下常量:更新结束
   XMLNSC.CommentsRetainNone = 0x0000000000000000
   XMLNSC.CommentsRetainAll = 0x0002000000000000
例如:
   DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS
   XMLNSC.CommentsRetainAll);
   ...
   CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.CommentsRetainNone);

操作处理指示信息

缺省情况下,会废弃处理指示信息,因为它们只是一些毫无意义的辅助信息。

但是,还提供了以下方式:解析时,文档(不是文档描述本身)中出现的任何处理指示信息都由带有相应名称和值的“名称-值”元素表示。因此提供了以下额外常量:
    XMLNSC.ProcessingInstruction
更新开始该方式由所有消息解析节点上的“XMLNSC 解析器选项”属性对话框导航器中的处理指示信息保留方式的设置控制。对于使用消息选项的程序化控制,提供了以下常量:更新结束
    XMLNSC.ProcessingInstructionsRetainNone = 0x0000000000000000
    XMLNSC.ProcessingInstructionsRetainAll = 0x0004000000000000
例如:
    DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data
    OPTIONS XMLNSC.ProcessingInstructionsRetainAll);
    ...
    CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS
    XMLNSC.ProcessingInstructionsRetainNone);

迁移现有的流

更新开始为了使用新的 XMLNSC 域和解析器,您必须重新编写 ESQL 代码才能在您的路径中使用 XMLNSC。请注意以下 ESQL 语句:
SET OutputRoot.XML.Person.Salary =
               CAST(InputRoot.XML.Person.Salary AS INTEGER) * 3;
SET OutputRoot.XMLNS.Person.Salary =
               CAST(InputRoot.XMLNS.Person.Salary AS INTEGER) * 3;
SET OutputRoot.XMLNSC.Person.Salary =
               CAST(InputRoot.XMLNSC.Person.Salary AS INTEGER) * 3;
更新结束
更新开始在每种情况中,在输入队列处期望并写入输出队列的 XML 位流的形式为:
    <Person><Salary>42</Salary></Person>
更新结束

更新开始由于这三个 ESQL 示例使用不同的解析器来拥有这些元素,因此它们并不相同。可以通过以下两项来设置拥有的解析器:第一种是通过入局消息,它具有指定消息集域的 MQRFH2 头和 <mcd> 文件夹。第二种是通过流输入节点的缺省属性中定义的消息集域。如果两个域定义都存在,则 MQRFH2<mcd> 文件夹中的消息集域的值优先。更新结束

更新开始如果您要迁移到 XMLNSC 域,则使用 MQRFH2 头时,在 <mcd> 文件夹的 <Msd> 字段中需要新的域名。 请注意,新域名出现在外发消息的 MQRFH2 头中。要保护外部应用程序不受这些更改的影响,可以在流的输入节点和 Compute 或 Mapping 节点上指定为 XMLNS 域使用 XMLNSC 压缩解析器属性。使用这些属性集,输入和输出消息不更改,允许 <Msd> 字段值保留为 XMLNS。 现在流使用压缩解析器,并且使用 XMLNSC 对 ESQL 路径进行编码。更新结束

更新开始如果入局消息不包含 MQRFH2 头,并且输入节点的消息域属性用于指定域,则您可以通过将流的输入节点域属性直接设置为 XMLNSC 来迁移到 XMLNS 域,或将它保留它为 XMLNSC,并且设置为 XMLNSC 域使用 XMLNS 压缩解析器属性。压缩解析器在流中使用,并且必须使用带有这些设置的 XMLNSC 对 ESQL 路径进行编码。更新结束

更新开始如果外发消息不包含 MQRFH2 头,则输出消息中的任何地方都不会出现此域,并且设置 Compute 节点的 为 XMLNS 域使用 XMLNSC 压缩解析器属性也不会有什么效果。更新结束

构造 XML 头

以下 ESQL 在 XML 域中有效:
SET OutputRoot.XML.(XML.XmlDecl)*.(XML.Version)* = '1.0';
要迁移到 XMLNS,只需要更改根:
SET OutputRoot.XMLNS.(XML.XmlDecl)*.(XML.Version)* = '1.0';

注意:虽然使用了 XMLNS 解析器,但是元素类型常量是属于 XML 解析器的常量。由于 XMLXMLNS 解析器使用相同的类型值,因此可以这样操作。但是,对于 XMLNSC 解析器,类型值是不同的,因此您必须始终使用它自己的类型常量。

XMLNSC 域中,没有用于 XML 版本的特殊类型;只将它作为 XML 声明的属性处理。以上示例的等价语法是:
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Version = '1.0';
更新开始同样,在 XMLNSC 域中,XML 编码类型和 XML 独立方式也被简单地作为 XML 声明的属性来处理,并且可以在 ESQL 中按如下方式设置:
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Encoding = 'UTF-8';
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)StandAlone = 'Yes';
更新结束

复制消息树

复制树时,代理将 XMLXMLNSC 视为不同的解析器,这表示源树中的所有属性都映射为目标树中的元素。只有您在同一个流中使用两个解析器(一个用作输入,一个用作输出)时才会发生此情况;在这种情况下,为这两种流使用压缩解析器。

如果必须为输入流和输出流使用不同的解析器,您可能需要显式地指定路径中元素的类型,或者使用 FIELDVALUE 函数来确保是复制标量值而不是复制子树。

结合主题使用消息体内容中的信息,按照处理 XML 域中的消息中为 XML 消息提供的指导信息进行操作。

使用相关名访问 XMLNSC 域中的语法元素

下表提供了每个 XML 语法元素的相关名。在 XMLNSC 域中工作时,请使用这些名称来引用输入消息中的元素,并在输出消息中设置元素、属性和值。
表 1. XML 语法元素的相关名
语法元素 相关名 常量值
文件夹 XMLNSC.Folder 0x01000000
文档类型1 XMLNSC.DocumentType 0x01000300
XML 声明2 XMLNSC.XmlDeclaration 0x01000400
     
字段或属性值 XMLNSC.Value 0x02000000
PCData 值 XMLNSC.PCDataValue 0x02000000
CData 值 XMLNSC.CDataValue 0x02000001
混合类型值 XMLNSC.HybridValue 0x02000002
     
实体引用 XMLNSC.EntityReference 0x02000100
     
字段 XMLNSC.Field 0x03000000
PCData XMLNSC.PCDataField 0x03000000
CData XMLNSC.CDataField 0x03000001
混合类型 XMLNSC.HybridField 0x03000002
     
属性 XMLNSC.Attribute 0x03000100
单引号 XMLNSC.SingleAttribute 0x03000101
双引号 XMLNSC.DoubleAttribute 0x03000100
     
名称空间声明 XMLNSC.NamespaceDecl 0x03000102
单引号 XMLNSC.SingleNamespaceDecl 0x03000103
双引号 XMLNSC.DoubleNamespaceDecl 0x03000102
     
位流数据 XMLNSC.BitStream 0x03000200
     
实体定义1 XMLNSC.EntityDefinition 0x03000300
单引号 XMLNSC.SingleEntityDefinition 0x03000301
双引号 XMLNSC.DoubleEntityDefinition 0x03000300
     
注释 XMLNSC.Comment 0x03000400
     
处理指示信息 XMLNSC.ProcessingInstruction 0x03000401
注意:
  1. 文档类型仅用于实体定义。例如:
    SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)BodyDocument
                  .(XMLNSC.EntityDefinition)TestDef =
     'Compact Tree Parser XML Test Module Version 1.0';
  2. XML 声明是特殊的文件夹类型,它包含版本的子元素等等。例如:
    -- Create the XML declaration
    SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Version = 1.0;
    SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Encoding = 'UTF8';
    SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Standalone = 'yes';

更新开始如何与 XMLNSC 解析器协同使用 EntityDefintion 和 EntityReference更新结束

更新开始提供以下两个示例来演示如何与使用 ESQL 的 XMLNSC 解析器协同使用 EntityDefintionEntityReference。两个示例都使用相同的输入消息:
<BookInfo dtn="BookInfo" edn="author" edv="A.N.Other">
<Identifier>ES39B103T6</Identifier>
</BookInfo>
更新结束
更新开始第一个示例显示和 XMLNSC 解析器协同使用 EntityDefintionEntityReference 的方法。这是该示例生成的输出消息:
<!DOCTYPE BookInfo [<!ENTITY author "A.N.Other">]>
<BookInfo><Identifier>ES39B103T7</Identifier><entref>&author;</entref></BookInfo>
更新结束
更新开始在以下 ESQL 中,XMLNSC.EntityDefinition 用于使用来自输入消息的 edv 中派生的 A.N.Other 值来定义硬编码的实体 author。XMLNSC.EntityReference 用于创建对 XML 消息体中的实体 author 的引用。
SET OutputRoot.MQMD = InputRoot.MQMD;
DECLARE cursor REFERENCE TO InputRoot.XMLNSC.BookInfo;
SET OutputRoot.XMLNSC.BookInfo.Identifier = cursor.Identifier;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)* NAME = cursor.dtn;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)* NAME = 'author';
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)author VALUE = cursor.edv;
SET OutputRoot.XMLNSC.(XMLNSC.BookInfo).entref.(XMLNSC.EntityReference)* = 'author';
更新结束

更新开始变量 cursor 用于指向以下变量:dtn(文档类型名);edv(实体定义值)以及 Identifier 的值。 这些变量的值是从输入消息中派生的。更新结束

更新开始第二个示例演示如何创建包含实体定义的输出消息,以及如何创建对基于同一个输入消息内容的实体的引用。这是由该示例生成的输出消息,它显示实体定义 author 和对 XML 消息体中的实体的引用:
<!DOCTYPE BookInfo [<!ENTITY author "Book 1">]>
<BookInfo Identifier="ES39B103T6">&author;</BookInfo>
更新结束
更新开始以下 ESQL 与 XMLNSC 解析器协同使用 EntityDefintionEntityReference 来生成上述的输出消息:
SET OutputRoot.MQMD = InputRoot.MQMD;
DECLARE cursor REFERENCE TO InputRoot.XMLNSC.BookInfo;
CREATE FIELD OutputRoot.XMLNSC.BookInfo;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)* NAME = cursor.dtn;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)* NAME = cursor.edn;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)* VALUE = 'Book 1';
SET OutputRoot.XMLNSC.(XMLNSC.Folder)*[<].(XMLNSC.EntityReference)* = cursor.edn;
SET OutputRoot.XMLNSC.Identifier.(XMLNSC.DoubleAttribute)Identifier = cursor.Identifier;
更新结束

更新开始XMLNSC.EntityDefinition 用于使用 Book 1 值来定义实体 author。然后使用 XMLNSC.EntityReference,在消息中创建对 author 实体的引用。 变量 cursor 用于指向以下变量:dtn(文档类型名);edn(实体定义名)以及 Identifier 的值。 这些变量都是从输入消息派生的。XMLNSC.DoubleAttribute 代码用于将双引号添加到 Identifier。要仅将单引号添加到 Identifier,则可以使用 XMLNSC.SingleAttribute更新结束

XMLNSC 解析器方式

缺省情况下,XMLNSC 解析器会废弃没有任何实际意义的文档元素。但可以使用解析器方式强制保留这些元素。您可以在以下节点的属性上配置这些方式,这些节点指定是否在 XMLNSC 域中解析消息。

XMLNSC 解析器的有效解析器方式为:
XMLNSC.MixedContentRetainNone
XMLNSC.MixedContentRetainAll
XMLNSC.CommentsRetainNone
XMLNSC.CommentsRetainAll
XMLNSC.ProcessingInstructionsRetainNone
XMLNSC.ProcessingInstructionsRetainAll
以下示例使用 XMLNSC.ProcessingInstructionsRetainAllXMLNSC.ProcessingInstructionsRetainNone 方式在解析时保留文档处理指示信息:
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC
                          .ProcessingInstructionsRetainAll);
...     
CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC
                          .ProcessingInstructionsRetainNone);
相关概念
消息流概述
XML 解析器和域
ESQL 概述
相关任务
设计消息流
定义消息流内容
处理 XML 域中的消息
相关参考
ESQL 引用
SET 语句
FIELDVALUE 函数
ASBITSTREAM 函数
CREATE 语句
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ac26040_