XMLNSC 域是 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 个值元素来表示格式化消息中的隐含空格。
属性和标记文本
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->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>
这三种情况的不同之处在于:它们使用不同的解析器来控制这些元素。因此,需要在入局消息的 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 头
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';
复制消息树
复制树时,代理将 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 解析器方式
缺省情况下,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);