使用 XPath 1.0 和 JavaCompute 节点从消息中抽取信息

XPath 是专门用于处理 XML 文档的查询语言,但它也可以应用于任何树结构进行查询。不管位流是什么格式,WebSphere Message Broker 都使用 XPath 从逻辑消息树中选择元素。关于 XPath 1.0 标准的 XPath 和 W3C 定义的更多信息,请参阅 XPath。本主题中使用的术语基于 XPath 1.0 的 W3C 定义中使用的术语。

本主题包含以下信息:

使用 evaluateXPath 方法抽取消息信息

evaluateXPath() 方法包含在用户定义的 Java 节点 API 中,它支持 XPath 1.0,但以下内容除外:
  • 名称空间轴和名称空间节点类型。名称空间轴返回特定元素的实际 XML 名称空间声明节点。这样您便可以在 XPath 表达式内处理 XML 前缀或 URI 声明。该轴返回非 XML 的位流的空节点设置。
  • 如果您使用 id() 函数,它将抛出 MbRecoverableException。

evaluateXPath() 方法可以在 MbMessage 对象(对于绝对路径)上调用,或者在 MbElement 对象(对于相对路径)上调用。XPath 表达式作为字符串参数传递给方法。提供了该方法的第二种形式,它采用 MbXPath 对象。如果需要,该对象将 XPath 表达式与变量绑定和名称空间映射封装在一起。

根据表达式的返回类型,evaluateXPath() 方法返回这四种类型之一的对象:
  • java.lang.Boolean,表示 XPath 布尔型
  • java.lang.Double,表示 XPath 数字类型
  • java.lang.String,表示 XPath 字符串型
  • java.util.List,表示 XPath 节点集。对于 MbElements,List 接口表示一列有序对象。它允许直接访问元素或获取 Iterator 或 MbElement 数组。

XPath 变量绑定

XPath 1.0 支持引用表达式中在求值前已赋值的变量。MbXPath 类有三个方法可用于从用户 Java 代码中除去这些变量或对这些变量赋值。赋予的值必须是 XPath 1.0 支持的四种类型之一:
  • 布尔
  • 节点集
  • 数字
  • 字符串

XPath 名称空间支持

对于 XML 消息,通过引用名称空间来使用从缩写的名称空间前缀到完整名称空间 URI 的映射,如以下 XML 示例所示:
<ns1:aaa xmlns:ns1='http://mydomain.com/namespace1'
         xmlns:ns2='http://mydomain.com/namespace2'>
  <ns2:aaa>
    <ns1:bbb/>
  </ns2:aaa>
</ns1:aaa>

虽然名称空间前缀对于表示名称空间十分方便,但它只在定义该映射的文档中有意义。定义全局意义的是名称空间 URI。另外,由于名称空间 URI 可以在尚未定义 xmlns 映射的情况下指定给语法元素,因此名称空间前缀的概念对于消息流中生成的文档没有意义。

因此,XMLNS(C) 和 MRM 解析器只显示到代理的名称空间 URI 和到用户代码(ESQL 或插件代码)的名称空间 URI。ESQL 允许用户设置他们自己的映射,以创建这些可能会很长的 URI 的缩写。这些映射在任何情况下都与在 XML 文档中定义的前缀无关(即使它们可能同名)。

XPath 处理器可用于将名称空间缩写映射到求值时扩展的 URI。MbXPath 类包含的方法可用于指定和除去这些名称空间映射。可以使用以下代码对 XML 示例进行寻址:
  MbMessage msg = assembly.getMessage();
List chapters= (List)msg.evaluateXPath("/document/chapter");
// this returns a list of all chapters in the document (length 1)

MbElement chapter = (MbElement)chapters.get(0); // the first one

// values can also be extracted directly using XPath
String title = (String)msg.evaluateXPath("string(/document/chapter/@title)");

String chapterText = (String)msg.evaluateXPath("string(/document/chapter/text())");

使用 XPath 扩展更新消息

XPath 的 WebSphere Message Broker 实现提供用于修改消息树的以下额外函数:
set-local-name(object)
将 context 节点扩展名的本地部分设置为自变量中指定的值。object 可以是任何有效的表达式,并且转换为字符串,使用时就象调用字符串函数一样。
set-namespace-uri(object)
将 context 节点扩展名的名称空间 URI 部分设置为自变量中指定的值。object 可以是任何有效的表达式,并且转换为字符串,使用时就象调用字符串函数一样。
set-value(object)
该函数将 context 节点的字符串值设置为自变量中指定的值。object 可以是任何有效的表达式,并且转换为字符串,使用时就象调用字符串函数一样。
为允许用户构建和修改语法元素树,除了 XPath 1.0 规范中定义的 13,还提供了以下轴:
select-or-create::name 或 ?name
?name 与 select-or-create::name 等价。如果 name 为 @name,则将创建或选择属性。它选择与指定的名称测试匹配的子节点,或根据以下规则创建新节点:
  • ?name 选择名为 name 的子代(如果存在)。如果没有名为 name 的子代,则 ?name 将它作为最后一个子代创建,然后选择它。
  • ?$namename 作为最后一个子代创建,然后选择它。
  • ?^namename 作为第一个子代创建,然后选择它。
  • ?>namename 作为下一个同代创建,然后选择它。
  • ?<namename 作为前一个同代创建,然后选择它。
相关信息
用户定义的 Java 节点 API
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ac30390_