Хранение XML данных в Oracle (Storing XML Data). Часть 2 - Специфицирование пространства имен
ОГЛАВЛЕНИЕ
Специфицирование пространства имен
Если сохраненный XML-документ имеет пространства имен (namespaces), то все XML-запросы к этому документу должны быть определены для пространства имен, так как <Namespace:Element> - это не одно и то же что <Element> в XML. Обе функции XMLType.existNode() и XMLType.extract() разрешают пользователю специфицировать пространство имен во втором параметре, как показано ниже:
MEMBER FUNCTION existsNode(xpath in varchar2, nsmap in varchar2)
RETURN number deterministic
MEMBER FUNCTION extract(xpath IN varchar2, nsmap IN varchar2)
RETURN XMLType deterministic
В этом случае Xpath требует использования полностью квалифицированных (qualified) XML имен, которые содержат имя элемента и его пространство имен. Например, вы можете вставить XML-документ с двумя декларированными пространствами имен в XMLTypes, как показано ниже:
CREATE TABLE temp (doc XMLType);
DECLARE
v_temp XMLType;
BEGIN
v_temp:= XMLType.createXML('<foo xmlns="http://www.example.com"
xmlns:xsd="http://www.w3c.org/2001/XMLSchema">
<foo_type xsd:type="date">03-11-1998</foo_type>
</foo>');
INSERT INTO temp VALUES(v_temp);
END;
Чтобы запросить этот документ, вы можете определить пространство имен и его префикс во втором параметре функции XMLType.extract() и квалифицировать XPath, используя префикс, как показано в следующем SQL-запросе:
SELECT a.doc.extract('/a:foo/a:foo_type',
'xmlns:a="http://www.example.com"')
FROM temp a;
Результатом будет:
<foo_type xmlns="http://www.example.com"
xmlns:xsd="http://www.w3c.org/2001/
XMLSchema" xsd:type="date">03-11-1998</foo_type>
ЗАМЕЧАНИЕ
Если вы не используете квалифицированное имя пространства имен в XPath после предоставленных пространств имен, вы получите [сообщение] ORA-31013: Invalid XPath expression error.
Если у вас есть несколько пространств имен, то можно составить из них список, используя второй параметр функций XMLType.existNode() и XMLType.extract() и разделить их пробелами, как показано в следующем примере:
SELECT a.doc.extract('/a:foo/a:lastupdate/@b:type',
'xmlns:a="http://www.example.com"
xmlns:b="http://www.w3c.org/2001/XMLSchema"') AS result
FROM temp a;
RESULT
--------------------------------------------------
date
ВЫВОДЫ
В этой главе рассматривались разнообразные опции XML-памяти и соответствующие им стратегии загрузки в Oracle Database 10g. Таблица 9-1 показывает взаимодействие между XML-памятью хранения и функциональностью предложенных XML-утилит для загрузки данных. Вы можете выбрать одну из этих утилит или использовать SQL- или PL/SQL- интерфейсы для загрузки XML-документов в базу данных Oracle.
Утилиты | Функцио- нальность | Реляцинное хранилище с XMLType представлениями | Таблицы XMLType | XMLType столбцы |
SQL*Loader | Утилита командной строки | Ограниченная поддержка | Да | Да |
XML SQL Utility | Утилита командной строки и программный Java- и PL/SQL-интерфейс | Да | Да | Да |
TransX Utility | Утилита командной строки и программный Java- интерфейс | Да | Да | Да |
XSQL Servlet | Утилита командной строки и программный Java- и HTTP- интерфейсы, подготовленные во встроенных обработчиках | Да | Да | Да |
HTTP/WebDAV | HTTP/WebDAV директории | Нет | Да, но таблица требует создания таблицы по умолчанию, до того как XML-схема будет зарегистрирована | Нет |
FTP Interfaces | FTP -интерфейсы | Нет | Да, но таблица требует создания таблицы по умолчанию, до того как схема будет зарегистрирована | Нет |
Таблица 9-1. Хранение XML-данных и утилиты загрузки данных