DB2 V9.7 for Linux, UNIX, and Windows

定义 XML 文档的文档模型

XML 文档的文档模型允许您定义如何将在 XML 文档中找到的元素映射至字段和/或文档属性。

以下是 XML 文档的示例:
<?xml version="1.0"?>
<purchaseOrder orderDate="2001-01-20">             [4]  
        <shipAddress countryCode="US">                [1]
                <name>Alice Smith</name>                  [2]
                <street>123 Maple Street</street>
                <city>Mill Hill</city>
                <state>CA</state>
                <zip>90999</zip>
        </shipAddress>
        <item partNo="123" quantity="1">           [3]
                <name>S&B Lawnmower Type ABC-x</name> 
                <price>239.90</price>
                <shipDate>2001-01-25</shipDate>
        </item>
        <item partNo="987" quantity="1">     [3]
                <name>Multifunction Rake ZYX</name>
                <price>69.90</price>
                <shipDate>2001-01-24</shipDate>
        </item>
</purchaseOrder>
以下是与上面的样本文档相匹配的 XML 文档模型的示例:
<?xml version="1.0"?>
<XMLModel>

<XMLFieldDefinition                   [1]
name="addresses"
locator="/purchaseOrder/shipAddress" />

<XMLFieldDefinition                  [2]
name="customerName"
locator="//shipAddress/name"
exclude="yes" />

<XMLAttributeDefinition                  [3]
name="partNumber"
type="NUMBER"
locator="/purchaseOrder//item/@partNo" />

<XMLFieldDefinition                  [4]
name="none"
locator="/purchaseOrder/@orderDate" />

</XMLModel>

第一行 <?xml version="1.0"?> 指定使用 XML 编写模型。每个字段都是在 XMLFieldDefinitionXMLAttributeDefinition 标记内定义的,它包含元素参数。

注意:所有文本字段定义都必须包含在 <XMLModel> 标记内。在创建索引期间,此标记名称是作为一个参数来传递的:CREATE INDEX i1 FOR TEXT ON T1(C2) DOCUMENTMODEL XMLModel in myModel.xml CONNECT TO db

使用与示例模型文件中的定义相对应的数字标记了样本中的字段和属性。

允许嵌套字段,例如,如果一个规范的 XPath 位置选择位于由另一个属性定义选择的 XML 元素中的节点。嵌套字段显示在上面的样本 XML 文档中。addresses 字段将选择 XML 文档中的一个节点,该节点将控制由 customerName 字段选择的节点。因此,该嵌入节点的内容在逻辑上同时属于这两个字段。尽管文本字段可以是重叠的,但是,只能对这些字段中的文本建立一次索引。在此示例中,当在带有字段限制进行搜索时,将同时在 addressescustomerName 中找到 Alice Smith。但是,由于定位器表达式的相匹配语义,不能将同一个 XML 节点映射至多个字段。

Net Search Extender 不会尝试检测 XML 文档的代码页。将采用 DB2® 代码页。

字段的内容由下列规则确定:
  • 对于其定位器与注释、处理指令或 XML 属性相匹配的字段,字段内容为实际注释文本、处理指令文本或者属性值文本。
  • 对于与 XML元素或根节点相匹配的字段,字段内容由来自任何嵌入元素(与具有规范 exclude="YES" 的字段相匹配的元素除外)的任何文本组成。

文档必须包含格式良好的 XML,但对于要在 XML 文档中指定的 DTD,则不必如此。不进行 DTD 验证或外部实体解析;Net Search Extender 只针对文档模型来匹配 XML 文档。内部实体在需要时被 XML 替代。

元素参数

以下是文档模型元素的参数:

name
对每个定义的文本字段或文档属性指定名称。这些名称使您能够将搜索查询限制为特定文本字段或文档属性的内容。
可在名称中使用下列变量的其中一个。该变量将由源文档中的匹配元素生成的字符串来替换。
Variable
$(NAME)
与 XPath 路径相匹配的 XML 元素的实际限定名(QName)。
$(LOCALNAME)
与 XPath 相匹配的 XML 元素的实际局部名(不带前缀)。
$(PATH)
实际绝对路径,以与 XPath 相匹配的 XML 元素的斜杠和标记序列组成(用作缺省文档模型中的名称)。
type
文档属性的类型必须是“NUMBER”。该参数不适用于字段定义。
locator
XPath 语言中的表达式,它们选择要用作搜索字段的源文档的各个部分。

当编写“XML 文档模型”文件时,locator 内的限定名(称为 QNames)必须与 XML 文档中的某些标记完全相同,否则,将不能识别任何字段,并且对字段的查询将不会返回结果。

下面是一些定位器的示例。
purchaseOrder | salesOrder
所有 purchaseOrder 元素和 salesOrder 元素
shipAddress
所有 shipAddress 元素
*
所有元素(它是 child::* 的缩写 – 有关进一步的信息,请参阅语法)
name/item
具有 name 父代的所有 item 元素
purchaseOrder//item
具有 purchaseOrder 祖代的所有 item 元素
/
根节点
comment()
所有注释节点
processing-instruction()
所有处理指令
attribute::*(或者 @*)
所有属性节点
文字为括在单引号或双引号内的字符串。有关终端标记的精确定义,请参阅 XML 建议。

Net Search Extender 文档模型支持的 XPath 定位器与“XML 样式表语言变换”(XSLT)模式相似。它们正是由不包含任何谓词或函数“id”和“key”或节点测试“text()”和“node()”的 XSLT 模式的子集组成。

ignore
YES 或 NO。使用该参数来建立定位器的异常。

有时您可能想要指定常规定位器(例如 *)以与想要对其建立索引的节点相匹配。但是您还可指定不应对与较特定定位器相匹配的某些节点建立索引。

为此,为在建立索引期间要忽略的节点的较特定定位器加上字段定义。于是就对此定位器指定了比常规定位器更高的优先级(请参阅下面的内容),并指定 ignore="yes"。这将指示索引器一定不要为匹配节点生成字段信息。

注意:当这种被忽略节点嵌入在字段生成节点中时,将对被忽略节点的内容建立索引,原因是它也属于字段生成节点的内容。

priority
-1 和 +1 之间的浮点数,它指定要给予由特定定位器找到的定义的优先级。
如果不指定优先级,将使用缺省优先级:
  • 将由 | 分隔的多个备用项视作一组定义,每个备用项一个定义。
  • 与单个名称相匹配的定位器;即,下列任一格式的定位器具有缺省优先级 0:
    • ChildOrAttributeAxisSpecifier QName
    • ChildOrAttributeAxisSpecifier processing-instruction(Literal))
  • 格式为 ChildOrAttributeAxisSpecifier NCName:* 的定位器具有缺省优先级 -0.25。
  • 格式为 ChildOrAttributeAxisSpecifier NodeTest 的其他定位器具有缺省优先级 -0.5。
  • 任何其他定位器具有缺省优先级 0.5。

注意定位器越具体,缺省优先级越高。例如,非特定定位器 * 给予找到的定义低优先级,而名称较特定的定位器给予较高的优先级。

另外,注意当一个节点与多个定位器相匹配时,您可以通过对它们指定优先级来确定选择哪个定义。将选择具有最高优先级的定义。如果两个定义具有相同的优先级,将选择最新的定义。

此冲突解决与在“XML 样式表语言变换”(XSLT)中使用的完全相同。

exclude
YES 或 NO。一个参数,它确定是否应排除字段定义中的文本并且不对其建立索引。此参数不适用于属性定义。

在该示例中,将排除字段定义“customerName”,但是将包括定义“addresses”。

注: 如果存在多个具有同一定位器值但名称不同的字段定义,那么仅最后一个字段定义生效。将忽略所有先前的字段定义。
下列模型文件包含一个字段定义。
			<XMLFieldDefinition
name="from"
exclude="NO"
locator="/document/email/from" />
建立索引后,在部分“from”中进行搜索时找到文档。
下一步,会在模型文件的末尾添加另一字段定义。
			<XMLFieldDefinition
name="from_last"
exclude="NO"
locator="/document/email/from" />
重新创建和更新索引后,在“from_last”部分中进行搜索时找到文档,但在“from”部分中进行搜索时找不到文档。