处理 XMLNS 域中的消息

本主题所提供的信息特定于处理属于 XMLNS 域的消息和由一般 XML 解析器解析的消息。XMLNS 域是 XML 域的扩展,并提供名称空间支持。结合主题使用消息体内容中的信息,按照处理 XML 域中的消息中为 XML 消息提供的指导信息进行操作。

以下示例显示如何使用 ESQL 来处理名称空间。在该示例主模块的起始处声明了名称空间常量,这样您就可以在 ESQL 语句中使用前缀,而不是整个名称空间 URI。

名称空间常量只影响 ESQL;它们不控制输出消息中生成的前缀。所生成输出消息中的前缀由名称空间声明控制。您可以使用 XML.NamespaceDecl 相关名在树中包含名称空间声明。然后,这些元素将用于在输出消息中生成名称空间声明。

如果生成输出消息时,限定元素或属性的名称空间没有相应的名称空间声明,则会使用 NSn 格式的前缀自动生成一个,其中 n 是一个正整数。

CREATE COMPUTE MODULE xmlns_doc_flow_Compute
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
CALL CopyMessageHeaders();

-- Declaration of namespace constants
DECLARE sp1 NAMESPACE 'http://www.ibm.com/space1';
DECLARE sp2 NAMESPACE 'http://www.ibm.com/space2';
DECLARE sp3 NAMESPACE 'http://www.ibm.com/space3';

-- Namespace declaration to associate prefix 'space1' with the namespace
SET OutputRoot.XMLNS.message.(XML.NamespaceDecl)xmlns:space1 = 'http://www.ibm.com/space1';
SET OutputRoot.XMLNS.message.sp1:data1 = 'Hello!';      
 
-- Default Namespace declaration
SET OutputRoot.XMLNS.message.sp2:data2.(XML.NamespaceDecl)xmlns = 'http://www.ibm.com/space2';
SET OutputRoot.XMLNS.message.sp2:data2.sp2:subData1 = 'Hola!';
SET OutputRoot.XMLNS.message.sp2:data2.sp2:subData2 = 'Guten Tag!';

SET OutputRoot.XMLNS.message.sp3:data3 = 'Bonjour!';

SET OutputRoot.Properties.MessageDomain = 'XMLNS';

RETURN TRUE;
END;

CREATE PROCEDURE CopyMessageHeaders() BEGIN
DECLARE I INTEGER 1;
DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
WHILE I < J DO
SET OutputRoot.*[I] = InputRoot.*[I];
SET I = I + 1;
END WHILE;
END;

END MODULE;
处理此 ESQL 时,将生成以下输出消息:
<message xmlns:space1="http://www.ibm.com/space1">
 <space1:data1>Hello!</space1:data1>
 <data2 xmlns="http://www.ibm.com/space2">
  <subData1>Hola!</subData1>
  <subData2>Guten Tag!</subData2>
 </data2>
 <NS1:data3 xmlns:NS1="http://www.ibm.com/space3">Bonjour!</NS1:data3>
</message>

您还可以指明,对指定的 XML 元素(及其子代,如果它是复合元素)进行不透明解析。即,使用包含实际 XML 位流(包含在不透明元素的起始标记和结束标记之间)的值(以 UTF-16 编码)在消息树中创建单个指定元素。如果元素的内容在消息流中不重要,则此选项可以提供性能优势。

要指定不透明解析某个 XML 元素,请使用具有 PARSE 子句的 ESQL CREATE 语句来解析 XML 文档。将 PARSE 子句的 FORMAT 限定符设置为常量、区分大小写的字符串“XMLNS_OPAQUE”,并将 PARSE 子句的 TYPE 限定符设置为要以不透明方式解析的 XML 元素的名称。TYPE 子句可以不带任何名称空间而指定元素名称(从而匹配任何名称空间),或带有名称空间前缀或完整名称空间 URI(从而匹配特定名称空间)。

请参阅以下示例:

DECLARE soap NAMESPACE 'http://schemas.xmlsoap.org/soap/envelope/';

DECLARE BitStream BLOB ASBITSTREAM(InputRoot.XMLNS
                                   ENCODING InputRoot.Properties.Encoding
                                   CCSID InputRoot.Properties.CodedCharSetId);
--No Namespace
  CREATE LASTCHILD OF OutputRoot
    DOMAIN('XMLNS')
          PARSE (BitStream
                 ENCODING InputRoot.Properties.Encoding
                 CCSID InputRoot.Properties.CodedCharSetId
                 FORMAT 'XMLNS_OPAQUE'
                 TYPE 'Body');

--Namespace Prefix
  CREATE LASTCHILD OF OutputRoot
    DOMAIN('XMLNS')
          PARSE (BitStream
                 ENCODING InputRoot.Properties.Encoding
                 CCSID InputRoot.Properties.CodedCharSetId
                 FORMAT 'XMLNS_OPAQUE'
                 TYPE 'soap:Body');

--Namespace URI
  CREATE LASTCHILD OF OutputRoot
    DOMAIN('XMLNS')
          PARSE (BitStream
                 ENCODING InputRoot.Properties.Encoding
                 CCSID InputRoot.Properties.CodedCharSetId
                 FORMAT 'XMLNS_OPAQUE'
                 TYPE '{http://schemas.xmlsoap.org/soap/envelope/}Body');

对 XML 元素进行不透明解析只在 XMLNS 域中提供;控制如何指定此操作在后续发行版中可能会有更改。

有关 CREATE 及其使用示例的更多信息,请参阅 CREATE 语句

相关概念
消息流概述
XML 解析器和域
ESQL 概述
相关任务
设计消息流
定义消息流内容
处理 XML 域中的消息
相关参考
ESQL 引用
DECLARE 语句
SET 语句
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ac17330_