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 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 编写模型。每个字段都是在 XMLFieldDefinition 或 XMLAttributeDefinition 标记内定义的,它包含元素参数。
注意:所有文本字段定义都必须包含在 <XMLModel> 标记内。在创建索引期间,此标记名称是作为一个参数来传递的:CREATE INDEX i1 FOR TEXT ON T1(C2) DOCUMENTMODEL XMLModel in myModel.xml CONNECT TO db。
使用与示例模型文件中的定义相对应的数字标记了样本中的字段和属性。
允许嵌套字段,例如,如果一个规范的 XPath 位置选择位于由另一个属性定义选择的 XML 元素中的节点。嵌套字段显示在上面的样本 XML 文档中。addresses 字段将选择 XML 文档中的一个节点,该节点将控制由 customerName 字段选择的节点。因此,该嵌入节点的内容在逻辑上同时属于这两个字段。尽管文本字段可以是重叠的,但是,只能对这些字段中的文本建立一次索引。在此示例中,当在带有字段限制进行搜索时,将同时在 addresses 和 customerName 中找到 Alice Smith。但是,由于定位器表达式的相匹配语义,不能将同一个 XML 节点映射至多个字段。
Net Search Extender 不会尝试检测 XML 文档的代码页。将采用 DB2® 代码页。
文档必须包含格式良好的 XML,但对于要在 XML 文档中指定的 DTD,则不必如此。不进行 DTD 验证或外部实体解析;Net Search Extender 只针对文档模型来匹配 XML 文档。内部实体在需要时被 XML 替代。
以下是文档模型元素的参数:
当编写“XML 文档模型”文件时,locator 内的限定名(称为 QNames)必须与 XML 文档中的某些标记完全相同,否则,将不能识别任何字段,并且对字段的查询将不会返回结果。
Net Search Extender 文档模型支持的 XPath 定位器与“XML 样式表语言变换”(XSLT)模式相似。它们正是由不包含任何谓词或函数“id”和“key”或节点测试“text()”和“node()”的 XSLT 模式的子集组成。
有时您可能想要指定常规定位器(例如 *)以与想要对其建立索引的节点相匹配。但是您还可指定不应对与较特定定位器相匹配的某些节点建立索引。
为此,为在建立索引期间要忽略的节点的较特定定位器加上字段定义。于是就对此定位器指定了比常规定位器更高的优先级(请参阅下面的内容),并指定 ignore="yes"。这将指示索引器一定不要为匹配节点生成字段信息。
注意:当这种被忽略节点嵌入在字段生成节点中时,将对被忽略节点的内容建立索引,原因是它也属于字段生成节点的内容。
注意定位器越具体,缺省优先级越高。例如,非特定定位器 * 给予找到的定义低优先级,而名称较特定的定位器给予较高的优先级。
另外,注意当一个节点与多个定位器相匹配时,您可以通过对它们指定优先级来确定选择哪个定义。将选择具有最高优先级的定义。如果两个定义具有相同的优先级,将选择最新的定义。
此冲突解决与在“XML 样式表语言变换”(XSLT)中使用的完全相同。
在该示例中,将排除字段定义“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”部分中进行搜索时找不到文档。