XMLNSC 域是 XMLNS 域的扩展,而 XMLNS 域是原始 XML 域的扩展。
XMLNS 域增加了名称空间支持。新的 XMLNSC 域构建压缩程度更高的树,这样,在处理大型消息时就会使用较少的内存。添加了一个新域,以便不会影响现有的应用程序。
消息树结构
<Folder1> <Folder2 Attribute1='AttributeValue1'> <Field1><Value1></Field1> <Field2 Attribute2='AttributeValue2'><Value2></Field2> </Folder2> </Folder1>
在 XMLNSC 域中,这由两个名称元素(Folder1 和 Folder2)以及四个“名称-值”元素(即,Attribute1、Field1、Field2 和 Attribute2)表示。
<Folder1> <Folder2> <Field1><Value1></Field1> <Field2><Value2></Field2> .... <Field100><Value100></Field100> </Folder2> </Folder1>
在这种情况下,XMLNSC 解析器通过两个名称和 100 个“名称-值”元素表示消息,而 XML 和 XMLNS 解析器将使用 102 个名称元素和 100 个值元素加上额外的 103 个值元素来表示格式化消息中的隐含空格。
XML 和 XMLNS 域在每个文件夹或字段的结束和开始之间为空白格式的字符创建“名称-值”元素。这些空格元素具有 XML 文档格式中使用的空格、跳格符、换行符或其他字符的一个空名称和值。这些元素没有价值,因此,可以废弃它们以提高压缩率。
同样,缺省行为是废弃输入流中的所有 XML 处理指令和注释,且在压缩域树中不创建元素。
属性和标记文本
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.SingleAttribute XMLNSC.DoubleAttribute
XMLNSC.Attribute
<Folder1 Item='ValueA'> <Item>Value1</Item> </Folder1>
SET ItemAttributeValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Attribute)Item; SET ItemFieldValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Field)Item;
此方法比将 Folder1 用作数组下标更好,因为即使输入流中没有属性,它也不会受到影响。
处理混合文本
缺省情况下,会废弃混合文本,因为它只包含一些空格,并不表示任何含义。
但是,还提供了以下方式:解析时,在开始和结束标记(即 open->open、close->close 和 close->open)之间出现的任何文本以单个未命名的 Value 元素表示。
值元素类型支持 PCDATA、CDATA 及混合类型,即前两种类型的混合。
XMLNSC.Value XMLNSC.PCDataValue XMLNSC.CDataValue XMLNSC.HybridValue
XMLNSC.MixedContentRetainNone = 0x0000000000000000 XMLNSC.MixedContentRetainAll = 0x0001000000000000
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC.MixedContentRetainAll); ... CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.MixedContentRetainNone);
处理注释
缺省情况下,会废弃注释,因为它们只是一些毫无意义的辅助信息。
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);
迁移现有的流
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;
<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 头
SET OutputRoot.XML.(XML.XmlDecl)*.(XML.Version)* = '1.0';
SET OutputRoot.XMLNS.(XML.XmlDecl)*.(XML.Version)* = '1.0';
注意:虽然使用了 XMLNS 解析器,但是元素类型常量是属于 XML 解析器的常量。由于 XML 和 XMLNS 解析器使用相同的类型值,因此可以这样操作。但是,对于 XMLNSC 解析器,类型值是不同的,因此您必须始终使用它自己的类型常量。
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Version = '1.0';
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Encoding = 'UTF-8'; SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)StandAlone = 'Yes';
复制消息树
复制树时,代理将 XML 和 XMLNSC 视为不同的解析器,这表示源树中的所有属性都映射为目标树中的元素。只有您在同一个流中使用两个解析器(一个用作输入,一个用作输出)时才会发生此情况;在这种情况下,为这两种流使用压缩解析器。
如果必须为输入流和输出流使用不同的解析器,您可能需要显式地指定路径中元素的类型,或者使用 FIELDVALUE 函数来确保是复制标量值而不是复制子树。
结合主题使用消息体内容中的信息,按照处理 XML 域中的消息中为 XML 消息提供的指导信息进行操作。
使用相关名访问 XMLNSC 域中的语法元素
语法元素 | 相关名 | 常量值 |
---|---|---|
文件夹 | 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 |
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)BodyDocument .(XMLNSC.EntityDefinition)TestDef = 'Compact Tree Parser XML Test Module Version 1.0';
-- 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
<BookInfo dtn="BookInfo" edn="author" edv="A.N.Other"> <Identifier>ES39B103T6</Identifier> </BookInfo>
<!DOCTYPE BookInfo [<!ENTITY author "A.N.Other">]> <BookInfo><Identifier>ES39B103T7</Identifier><entref>&author;</entref></BookInfo>
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 的值。
这些变量的值是从输入消息中派生的。
<!DOCTYPE BookInfo [<!ENTITY author "Book 1">]> <BookInfo Identifier="ES39B103T6">&author;</BookInfo>
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.MixedContentRetainNone XMLNSC.MixedContentRetainAll XMLNSC.CommentsRetainNone XMLNSC.CommentsRetainAll XMLNSC.ProcessingInstructionsRetainNone XMLNSC.ProcessingInstructionsRetainAll以下示例使用 XMLNSC.ProcessingInstructionsRetainAll 和 XMLNSC.ProcessingInstructionsRetainNone 方式在解析时保留文档处理指示信息:
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC .ProcessingInstructionsRetainAll); ... CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC .ProcessingInstructionsRetainNone);