在搜索中使用名称空间
必须在搜索项的 @xmlxp 查询序言中定义 QName 前缀和缺省元素 namespaces 。
将名称空间 ns1 映射到 URI "http://mycompany.com" 的示例序言
declare namespace ns1 = "http://mycompany.com"; 用于指定所有未限定元素都由 URI "http://mycompany.com"限定的示例序言:
declare default element namespace "http://mycompany.com"如果查询未声明任何名称空间 QName 前缀或缺省元素名称空间,那么不会在查询中考虑名称空间。 如果元素或属性名称存在于任何名称空间中,那么会将其视为匹配项。
如果声明了任何 QName 前缀或缺省名称空间,那么仅当元素或属性名称存在于指定的名称空间中时,它们才会匹配。
declare default element namespace "”; 可用于指示未限定的标记不在任何名称空间中。XML 搜索字符串中使用的 QName 前缀不需要与 XML 文档中使用的 QName 前缀匹配。 匹配仅基于长名称 URI。
示例:
将搜索限制为元素 test 的属性 attr ,其中元素 test 映射到 namespace "http://posample.org",而 attr 不在任何 namespace中。 使用缺省 namespace 来简化语法。
CONTAINS(myxmlcol, '@xmlxp:''declare default element namespace “http://myexample.org”;
/test[@attr > xs:date(“2005-01-01”)]''')将搜索限制为元素 test 的属性 attr ,其中元素 test 的 namespace 为 "http://myexample.org"。 通过使用 QName 前缀 abc来使用显式 namespace 语法。
CONTAINS(myxmlcol, '@xmlxp:''declare namespace abc = “http://myexample.org”;
/abc:test[@attr < xs:date(“2009-01-01”)]''')将搜索限制为使用 QName prefix ns1显式映射到 namespace "http://myexample.org" 的元素 purchaseOrder的 shipTo name 和 billTo name 子元素。 还定义了缺省名称空间 ("http://mastsample.org") ,这适用于 shipTo, name和 billTo。
CONTAINS(myxmlcol, '@xmlxp:'' declare default namespace "http://mastsample.org";
declare namespace ns1 = "http://posample.org"; /ns1:purchaseOrder[shipTo/name = "Jane"
and billTo/name = "Jason"]''')将搜索限制为 shipTo 元素 (在缺省名称空间 "http://mastsample.org"中) 的属性 name (在名称空间 "http://posample.org"中显式定义) ,这是元素 purchaseOrder 的子代 (在名称空间 "http://posample.org"中显式定义)。 缺省名称空间 "http://mastsample.org" 适用于元素 shipTo, billTo 和 name。
CONTAINS(myxmlcol, '@xmlxp:'' declare default namespace "http://mastsample.org";
declare namespace ns1 = "http://posample.org"; /ns1:purchaseOrder/shipTo[@ns1:name =
"Jane" and billTo/name = "Jason"]''')XML 搜索示例
- 在模式
XMLTEST中创建表XML_DOCUMENTS以存储 XML 文档:CREATE TABLE XMLTEST.XML_DOCUMENTS (ID INT, XML_DATA XML, PRIMARY KEY (ID)); - 在 XML 列上创建名为
XML_INDEX的文本搜索索引:call SYSPROC.SYSTS_CREATE('XMLTEST', 'XML_INDEX', 'XMLTEST.XML_DOCUMENTS(XML_DATA)', ''); - 插入一些 XML 文档:
INSERT INTO XMLTEST.XML_DOCUMENTS (ID, XML_DATA) VALUES(1, '<BOOK publication_date="2009-01-01">' || ' <TITLE> OmniFind Text Search Server for DB2 </TITLE>' || ' <ID_NUMBER> 1 ></ID_NUMBER>' || ' <CHAPTER>' || ' <NUMBER> 1 </NUMBER>' || ' <TITLE> Introduction </TITLE>' || ' <ABSTRACT> This chapter will introduce the reader to the capabilities of OmniFind for DB2 for IBM i </ABSTRACT>' || ' </CHAPTER>'|| ' <CHAPTER>' || ' <NUMBER> 2 </NUMBER>' || ' <TITLE> Creating a Text Search Index </TITLE>' || ' <ABSTRACT> This chapter will explain how to create a text search index </ABSTRACT>' || ' </CHAPTER>' || '</BOOK>');INSERT INTO XMLTEST.XML_DOCUMENTS (ID, XML_DATA) VALUES(2, '<BOOK publication_date="2010-02-01">' || ' <TITLE> Using the XML data type for DB2 for IBM i </TITLE>' || ' <ID_NUMBER> 2 ></ID_NUMBER>' || ' <CHAPTER>' || ' <NUMBER> 1 </NUMBER>' || ' <TITLE> Introduction </TITLE>' || ' <ABSTRACT> This chapter will introduce the reader to the DB2 XML data type </ABSTRACT>' || ' </CHAPTER> ' || ' <CHAPTER>' || ' <NUMBER> 2 </NUMBER>' || ' <TITLE> Inserting XML data into a DB2 table </TITLE>' || ' <ABSTRACT> This chapter will explain how to insert XML data into a DB2 table </ABSTRACT>' || ' </CHAPTER>' || ' <CHAPTER>' || ' <NUMBER> 3 </NUMBER>' || ' <TITLE> Searching XML data </TITLE>' || ' <ABSTRACT> This chapter will explain how to query data in XML columns using the CONTAINS and SCORE UDFS </ABSTRACT>' || ' </CHAPTER>' || '</BOOK>');INSERT INTO XMLTEST.XML_DOCUMENTS (ID, XML_DATA) VALUES(3, '<BOOK xmlns="http://www.ibm.com/digital_media_library"' || ' publication_date="2010-02-01">' || ' <TITLE> Using Namespaces with OmniFind Text Search Server for DB2 for IBM i </TITLE>' || ' <ID_NUMBER> 2 </ID_NUMBER>' || ' <CHAPTER>' || ' <NUMBER> 1 </NUMBER>' || ' <TITLE> Introduction </TITLE>' || ' <ABSTRACT> This chapter will introduce the reader to XML namespaces </ABSTRACT>' || ' </CHAPTER>' || ' <CHAPTER>' || ' <NUMBER> 2 </NUMBER>' || ' <TITLE> Using default namespaces </TITLE>' || ' <ABSTRACT> This chapter will explain how to use a namespace in an XML search </ABSTRACT>' || ' </CHAPTER>' || '</BOOK>'); - 更新索引:
CALL SYSPROC.SYSTS_UPDATE('XMLTEST', 'XML_INDEX', '');
示例查询
示例 1:
查找具有根元素 BOOK 且具有包含 DB2的直接后代 TITLE 的所有文档。
SELECT ID
FROM XMLTEST.XML_DOCUMENTS
WHERE CONTAINS(XML_DATA, '@xmlxp:''/BOOK/TITLE[. contains("DB2")]'' ') = 1;因为未在搜索项中指定名称空间序言,所以在搜索中不考虑任何名称空间。
| 标识 |
|---|
| 1 |
| 2 |
| 3 |
示例 2:
查找具有根元素 BOOK 且具有包含 DB2的直接后代 TITLE 的所有文档。 使用缺省元素名称空间来指示 BOOK 和 TITLE 必须位于 "http://www.ibm.com/digital_media_library” namespace中。
SELECT ID
FROM XMLTEST.XML_DOCUMENTS
WHERE CONTAINS(XML_DATA, '@xmlxp:''declare default element namespace
"http://www.ibm.com/digital_media_library";
/BOOK/TITLE[. contains("DB2")]'' ') = 1;
| 标识 |
|---|
| 3 |
示例 3:
查找其根元素BOOK 在 "2010-01-01" 之后具有属性 publication_date 且具有包含 DB2的子元素 TITLE 的所有文档。 限制搜索,以便标记 BOOK 和 TITLE 不得存在于任何名称空间中。SELECT ID
FROM XMLTEST.XML_DOCUMENTS
WHERE CONTAINS(XML_DATA, '@xmlxp:''declare default element namespace "";
/BOOK[@publication_date > xs:date("2010-01-01")]/TITLE[. contains("DB2")]'' ') = 1;
| 标识 |
|---|
| 2 |
示例 4:
查找根元素为BOOK (不在任何名称空间中) 且具有直接后代 CHAPTER (也不在名称空间中) 且包含有关将数据插入 XML 表的信息的所有文档。SELECT ID
FROM XMLTEST.XML_DOCUMENTS
WHERE CONTAINS(XML_DATA, '@xmlxp:''declare default element namespace "";
/BOOK/CHAPTER[. contains("inserting XML data into a table")]'' ') = 1;CHAPTER中包含的文本包含作为CHAPTER后代的ABSTRACT和TITLE元素中包含的文本。- 搜索字符串不区分大小写,并且会考虑搜索词的语言变体。
| 标识 |
|---|
| 2 |
示例 5:
查找根元素为BOOK (在名称空间 “http://www.ibm.com/digital_media_library”中) 且具有直接后代 CHAPTER (也在名称空间 “http://www.ibm.com/digital_media_library”中) 的所有文档。 CHAPTER 必须具有值为 1的直接后代 NUMBER (在名称空间 “http://www.ibm.com/digital_media_library"中) ,并且还包含有关搜索 XML 名称空间的文本信息。SELECT ID
FROM XMLTEST.XML_DOCUMENTS
WHERE CONTAINS(XML_DATA, '@xmlxp:''declare namespace ns1 = "http://www.ibm.com/digital_media_library";
/ns1:BOOK/ns1:CHAPTER[. contains("search XML using a namespace") and NUMBER = 1]'' ') = 1;文档 #3 是唯一在正确名称空间中具有标记的文档,但它仅在数字值为 2 (而不是 1) 的章节中具有关键字匹配项。
未返回任何行。
| 标识 |
|---|
示例 6:
查找具有根元素BOOK(在名称空间 “http://www.ibm.com/digital_media_library”中) 且具有直接后代 CHAPTER (在名称空间 “http://www.ibm.com/digital_media_library”中) 的所有文档。 CHAPTER 必须具有值为 1的直接后代 NUMBER (在名称空间 “http://www.ibm.com/digital_media_library”中)。 BOOK 必须具有包含有关搜索 XML 名称空间的文本信息的后代 CHAPTER (不一定具有 NUMBER 后代)。SELECT ID
FROM XMLTEST.XML_DOCUMENTS
WHERE CONTAINS(XML_DATA, '@xmlxp:''declare namespace ns1 = "http://www.ibm.com/digital_media_library";
/ns1:BOOK[ns1:CHAPTER contains("search XML using a namespace")]/ns1:CHAPTER[ns1:NUMBER = 1]'' ') = 1;文档 3 具有与 CONTAINS 条件匹配的 CHAPTER 元素,并且还具有具有值为 1的后代 NUMBER 的 CHAPTER 元素。 因此,文档 3 是此查询的匹配项。
| 标识 |
|---|
| 3 |