XML 消息域包含符合 W3C XML 标准的所有消息。
该域中的消息由 XML、XMLNS 或 XMLNSC 解析器中的某个进行处理。XMLNS 域是 XML 域的扩展,并包含符合相同标准且可使用 XML 规范的名称空间功能的消息。该域中的消息由 XML 解析器进行处理。
XML 解析器是用于解释位流或树的程序,该位流或树表示的消息属于 XML 域,并且该程序在输入时从位流生成相应的树,或在输出时从树生成位流。 位流是 XML 文件的一种表示。(XML 解析器还解释所表示的消息属于 JMS 域的位流或树;该域中没有 JMS 解析器。)
您的应用程序可用两种方法将 XML 消息(拥有或没有名称空间支持)与 WebSphere Message Broker 代理交换:
每个内置节点都可处理自定义消息。整个消息可以存储在数据库中,并且头在通过消息流传递时可以添加到消息或从 消息除去。
自定义消息也称为通用 XML 消息。它没有已记录的格式,但以符合 XML 规范的文档形式携带有关其内容和结构的信息。它的定义并不保留在任何其他位置。当代理接收到 XML 消息时,XML 解析器会解释它,并且根据消息内包含的 XML 定义来创建内部消息树结构。
XML 解析器如何处理空元素和值的详细信息在 XML 解析器和空值中进行了描述。
WebSphere Message Broker 提供的信息并不提供 XML 术语、概念和消息构造的完整定义或描述:它只是一个摘要,强调了在 XML 消息与代理和消息流一起使用时的重要方面。
有关 XML 的更多信息,请参阅 developerWorks Web 站点。
本描述中使用的名称元素(例如,XmlDecl)都由 WebSphere Message Broker 提供,并且作为相关名引用。它们可用于 ESQL 中使用的符号,这些 ESQL 定义由消息流中 Compute 或 Filter 等节点执行的消息内容处理。 它们不是 XML 规范的一部分。由于 XML 内容处理各不相同,每个 XML 解析器定义其自己的相关名集。
XML 名称元素(例如,Element 和 XmlDecl)的相关名等同于格式为 0x01000000 等的常量值。您可以参阅这些用于输出(在跟踪一个消息或一部分消息时由 Trace 节点创建)的常量。
简单 XML 消息可以采用以下格式:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE Envelope PUBLIC "http://www.ibm.com/dtds" "example.dtd" [<!ENTITY Example_ID "ST_TimeoutNodes Timeout Request Input Test Message">] > <Envelope version="1.0"> <Header> <Example>&Example_ID;</Example> <!-- This is a comment --> </Header> <Body version="1.0"> <Element01>Value01</Element01> <Element02/> <Element03> <Repeated>ValueA</Repeated> <Repeated>ValueB</Repeated> </Element03> <Element04><P>This is <B>bold</B> text</P></Element04> </Body> </Envelope>
以下部分显示了在 XML 和 XMLNSC 解析器中解析以上消息时由 Trace 节点创建的输出,从而说明当代理处理数据时,用于表示数据的各内部结构中存在的区别。
注意,由于空格、制表符和换行符将原始 XML 文档进行了格式化,所以在下面部分存在树中的 WhiteSpace 元素;为能清晰表示,跟踪内的实际字符均已用 'WhiteSpace' 替换。XML 元素中的 WhiteSpace 是有商业含义的,使用 Content 语法元素来表示。请注意,XmlDecl、DTD 和注释使用显式相关名语法元素在 XML 域中表示。
(0x01000010):XML = ( (0x05000018):XML = ( (0x06000011): = '1.0' (0x06000012): = 'UTF-8' (0x06000014): = 'no' ) (0x06000002): = 'WhiteSpace' (0x05000020):Envelope = ( (0x06000004): = 'http://www.ibm.com/dtds' (0x06000008): = 'example.dtd' (0x05000021): = ( (0x05000011):Example_ID = ( (0x06000041): = 'ST_TimeoutNodes Timeout Request Input Test Message' ) ) ) (0x06000002): = 'WhiteSpace' (0x01000000):Envelope = ( (0x03000000):version = '1.0' (0x02000000): = 'WhiteSpace' (0x01000000):Header = ( (0x02000000): = 'WhiteSpace' (0x01000000):Example = ( (0x06000020): = 'Example_ID' (0x02000000): = 'ST_TimeoutNodes Timeout Request Input Test Message' (0x06000021): = 'Example_ID' ) (0x02000000): = 'WhiteSpace' (0x06000018): = ' This is a comment ' (0x02000000): = 'WhiteSpace' ) (0x02000000): = 'WhiteSpace' (0x01000000):Body = ( (0x03000000):version = '1.0' (0x02000000): = 'WhiteSpace' (0x01000000):Element01 = ( (0x02000000): = 'Value01' ) (0x02000000): = 'WhiteSpace' (0x01000000):Element02 = (0x02000000): = 'WhiteSpace' (0x01000000):Element03 = ( (0x02000000): = 'WhiteSpace' (0x01000000):Repeated = ( (0x02000000): = 'ValueA' ) (0x02000000): = 'WhiteSpace' (0x01000000):Repeated = ( (0x02000000): = 'ValueB' ) (0x02000000): = 'WhiteSpace' ) (0x02000000): = 'WhiteSpace' (0x01000000):Element04 = ( (0x01000000):P = ( (0x02000000): = 'This is ' (0x01000000):B = ( (0x02000000): = 'bold' ) (0x02000000): = ' text' ) ) (0x02000000): = 'WhiteSpace' ) (0x02000000): = 'WhiteSpace' )
以下跟踪显示了用于表示压缩 XMLNSC 解析器内相同 XML 结构(以其缺省方式表示)而创建的元素。该方式中,压缩解析器不保留注释,处理结构或混合文本。
通过比较可明显地发现,使用压缩解析器可以大大减少用于表示示例 XML 消息业务内容的语法元素的数量。
请注意,如果不保留混合文本,所有不具有业务数据内容的 WhiteSpace 元素将不再于 Broker 消息树中采取任何运行时限制。然而,这也会使“Element04.P”中的混合文本遭到废弃,且树中仅保留子代文件夹“Element04.P.B”的值,文本“P”中的“这是”和“文本”也遭废弃。 通常此种类型的 XML 结构不会与业务数据格式关联,因此一般都需要使用压缩 XMLNSC 解析器。但如果您需要此类处理,则您不应使用 XMLNSC 解析器或将其与启用的“保留混合文本”方式结合使用。
XML 声明的处理也会在压缩解析器中根据版本、编码和独立属性而不同,这些因素保存为 XmlDeclaration 而非特定相关名元素的子代。
(0x01000000):XMLNSC = ( (0x01000400):XmlDeclaration = ( (0x03000100):Version = '1.0' (0x03000100):Encoding = 'UTF-8' (0x03000100):StandAlone = 'no' ) (0x01000000):Envelope = ( (0x03000100):version = '1.0' (0x01000000):Header = ( (0x03000000):Example = 'ST_TimeoutNodes Timeout Request Input Test Message' ) (0x01000000):Body = ( (0x03000100):version = '1.0' (0x03000000):Element01 = 'Value01' (0x01000000):Element02 = (0x01000000):Element03 = ( (0x03000000):Repeated = 'ValueA' (0x03000000):Repeated = 'ValueB' ) (0x01000000):Element04 = ( (0x01000000):P = ( (0x03000000):B = 'bold' ) ) )