本主题所提供的信息特定于处理属于 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;
<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 语句。