使用 XMLNSC 解析器处理消息

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

XMLNS 域的目的是添加名称空间支持,并且出于兼容性原因,它创建一个新域,以便不会影响现有的应用程序。新 XMLNSC 域的目的是构建压缩性更大的树,这样,在处理大型消息时就会使用较少的内存。同样也是出于兼容性原因,添加了新域,以便不会影响现有的应用程序。

消息树结构

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

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

XMLXMLNS 域与 XMLNSC 的不同之处在于:它们的每一个字段都用带有一个子值元素的名称元素表示。这可能看似一个小的区别,但消息通常具有许多这样的叶字段;例如:
<Folder1>
<Folder2>
<Field1><Value1></Field1>
<Field2><Value2></Field2>
....
<Field100><Value100></Field100>
</Folder2>
</Folder1>

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

属性和标记文本

由于属性和标记文本都由“名称-值”元素表示,因此它们通过是否使用元素类型来区分。如果未指定类型,则假定是标记文本。因此,上述第一个示例消息可能由 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’;

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

处理混合文本

缺省情况下,混合的文本只在仅格式化但没有意义(如果存在)时才会被废弃。

不过,系统还提供了一种方式,如果使用这种方式,在解析时,在开始标记和结束标记(即,open->openclose->closeclose->open 之间以外出现的任何文本由单个 Value 元素表示。值元素类型支持 PCDATACDATA 及混合类型,即前两种类型的混合。

仍然没有与值的获取和设置相关的特殊语法元素行为。Value 元素只能通过显式访问从 SQL 进行访问。以下额外常量为此用途提供:
XMLNSC.Value
XMLNSC.PCDataValue
XMLNSC.CDataValue
XMLNSC.HybridValue
此方式由新消息选项值控制。对于此用途,提供了以下常量:
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.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.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。请参阅以下示例:
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>

这三种情况的不同之处在于:它们使用不同的解析器来控制这些元素。因此,需要在入局消息的 MQRFH2 头中提供不同的域名,在外发消息的 MQRFH2 头中写入不同的域名。

要保护外部应用程序不受这些更改影响,可以在流的输入节点和包含这些语句的 Compute 节点上指定为 XMLNS 域使用 XMLNSC 压缩解析器属性。

在输入节点上指定此属性会导致当入局消息中的 MQRFH2 头指定 XMLNS 域时,使用 XMLNSC 解析器解析消息主体;而在 Compute 节点上指定此属性会导致外发 MQRFH2 指定 XMLNS 而不是 XMLNSC 解析器来保持输入和输出消息不变。

如果入局消息不包含 MQRFH2 头,并且输入节点的消息域属性用于指定域,则您可以将它设置为 XMLNSC,或将它设置为 XMLNS,也可以设置为 XMLNS 域使用 XMLNSC 压缩解析器属性。

如果外发消息不包含 MQRFH2 头,那么输出消息中的任何地方都不会出现此域,并且设置 Compute 节点的 Use XMLNSC Compact Parser for XMLNS Domain 属性也不会有什么影响。

构造 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';

复制消息树

复制树时,代理将 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 解析器方式

缺省情况下,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/05/19
ac26040_