Как из xml файла составить самостоятельно таблицу
Argument ‘Topic id’ is null or empty
Сейчас на форуме
© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru
Использование любых материалов сайта допускается строго с указанием прямой ссылки на источник, упоминанием названия сайта, имени автора и неизменности исходного текста и иллюстраций.
| ООО «Планета Эксел» ИНН 7735603520 ОГРН 1147746834949 |
ИП Павлов Николай Владимирович ИНН 633015842586 ОГРНИП 310633031600071 |
Создаём XML-файл
XML-формат предназначен для хранения данных, которые могут пригодиться в работе некоторых программ, сайтов и поддержки определённых языков разметки. Создать и открыть файл с таким форматом не сложно. Это вполне можно сделать, даже если на компьютере не установлено какое-либо специализированное программное обеспечение.
Немного об XML
Сам по себе XML — это язык разметки, чем-то похожий на HTML, который используется на веб-страницах. Но если последний применяется только для вывода информации и её правильной разметки, то XML позволяет её структурировать определённым образом, что делает этот язык чем-то похожим на аналог базы данных, который не требует наличия СУБД.
Создавать XML-файлы можно как при помощи специализированных программ, так и встроенным в Windows текстовым редактором. От вида используемого ПО зависит удобство написания кода и уровень его функциональности.
Способ 1: Visual Studio
Вместо этого редактора кода от Microsoft можно использовать любой его аналог от других разработчиков. По факту Visual Studio является более расширенной версией обычного «Блокнота». Код теперь имеет специальную подсветку, ошибки выделяются или исправляются автоматически, также в программу уже загружены специальные шаблоны, которые позволяют упростить создание XML-файлов больших объёмов.
Для начала работы вам нужно создать файл. Нажмите по пункту «Файл» в верхней панели и из выпадающего меню выберите «Создать…». Откроется список, где указывается пункт «Файл».
Вас перебросит в окно с выбором расширения файла, соответственно выбирайте пункт «XML-файл». 
В только что созданном файле уже будет первая строка с кодировкой и версией. По умолчанию прописана первая версия и кодировка UTF-8, которые вы можете поменять в любое время. Дальше для создания полноценного XML-файла вам нужно прописать всё то, что было в предыдущей инструкции.
По завершении работы снова выберите в верхней панели «Файл», а там из выпадающего меню пункт «Сохранить всё».
Способ 2: Microsoft Excel
Можно создать XML-файл и не прописывая код, например, при помощи современных версий Microsoft Excel, который позволяет сохранять таблицы с данным расширением. Однако нужно понимать, что в этом случае создать что-то более функциональное обычной таблицы не получится.
Такой способ больше подойдёт тем, кто не хочет или не умеет работать с кодом. Однако в этом случае пользователь может столкнуться с определёнными проблемами при перезаписи файла в XML-формат. К сожалению, проделать операцию преобразования обычной таблицы в XML можно только на самых новых версиях MS Excel. Чтобы это сделать, используйте следующую пошаговую инструкцию:
- Заполните таблицу каким-либо контентом.
- Нажмите на кнопку «Файл», что в верхнем меню.

- Откроется специальное окно, где нужно нажать на «Сохранить как…». Этот пункт можно найти в левом меню.

- Укажите папку, куда необходимо сохранить файл. Папка указывается в центральной части экрана.

- Теперь вам нужно указать название файла, а в разделе «Тип файла» из выпадающего меню выбрать
«XML-данные». - Нажмите на кнопку «Сохранить».

Способ 3: Блокнот
Для работы с XML вполне подойдёт даже обычный «Блокнот», однако пользователю, который не знаком с синтаксисом языка, придётся трудно, так как в нём нужно прописывать различные команды и теги. Несколько проще и значительно продуктивнее процесс будет идти в специализированных программах для редактирования кода, например, в Microsoft Visual Studio. В них есть специальная подсветка тегов и всплывающие подсказки, что значительно упрощает работу человеку, плохо знакомому с синтаксисом этого языка.
Для этого способа не потребуется что-либо скачивать, так как в операционную систему уже встроен «Блокнот». Давайте попробуем сделать в нём простую XML-таблицу по данной инструкции:
-
Создайте обычный текстовый документ с расширением TXT. Разместить его можно где угодно. Откройте его.


Примерно так у вас должен выглядеть готовый результат:

XML-компиляторы должны обработать этот код в виде таблицы с одной колонкой, где указаны данные о неком Иване Иванове.
В «Блокноте» вполне можно сделать несложные таблицы наподобие этой, но при создании более объёмных массивов данных могут возникнуть сложности, так как в обычном «Блокноте» нет функций исправления ошибок в коде или их подсветки.
Как видите в создании XML-файла нет ничего сложного. При желании его может создать любой пользователь, который более-менее умеет работать на компьютере. Однако для создания полноценного XML-файла рекомендуется изучить данный язык разметки, хотя бы на примитивном уровне.
Сопоставление XML-элементов с ячейками карты XML
Для импорта и экспорта данных XML в Excel удобно использовать карту XML, которая связывает XML-элементы с данными в ячейках для получения нужных результатов. Чтобы создать такую карту, нужны файл схемы XML (XSD-файл) и файл данных XML (XML-файл). После создания карты XML можно сопоставить XML-элементы нужным образом.
Совет: Дополнительные сведения об использовании XML в Excel см. в этом обзоре XML в Excel.
- Поиск или создание файлов схемы XML и данных XML
- Использование образцов файлов схемы XML и данных XML
- Создание карты XML
- Сопоставление XML-элементов
Поиск или создание файлов схемы XML и данных XML
Файлы схемы XML и данных XML уже могут быть доступны, если они были созданы другой базой данных или приложением. Например, у вас могут быть бизнес-приложение, которое экспортирует данные в эти форматы XML-файлов, коммерческий веб-сайт или веб-служба, которые поставляют такие XML-файлы, или пользовательское приложение, разработанное в вашем ИТ-отделе, которое автоматически создает такие XML-файлы.
Если нужные XML-файлы отсутствуют, их можно создать, сохранив в текстовом файле данные, которые требуется использовать. Затем с помощью Access и Excel этот текстовый файл можно преобразовать в нужные XML-файлы. Ниже описано, как это сделать.
- Импортируйте текстовый файл, который требуется преобразовать, и свяжите его с новой таблицей.
- Выберите команду Файл >Открыть.
- В диалоговом окне Открытие найдите и откройте базу данных, в которой требуется создать новую таблицу.
- На вкладке Внешние данные выберите команду Текстовый файл и выполните инструкции для каждого шага, связав таблицу с нужным текстовым файлом. Access создает новую таблицу, имя которой отображается в области навигации.
- На вкладке Внешние данные выберите команду XML-файл (в группе Экспорт).
- В диалоговом окне Экспорт — XML-файл укажите имя и формат файла и нажмите кнопку ОК.
- Создайте карту XML на основе файла схемы XML, экспортированного из Access. Если открывается диалоговое окно Несколько корней, выберите элемент dataroot, чтобы создать XML-таблицу.
- Создайте XML-таблицу, сопоставив элемент dataroot. Дополнительные сведения см. в разделе Сопоставление XML-элементов.
- Импортируйте XML-файл, экспортированный из Access.
- В Excel не поддерживаются некоторые типы конструкций элементов схем XML. Ниже перечислены конструкции элементов схем XML, которые невозможно импортировать в Excel.
- Этот элемент позволяет вам включить в схему элементы, не объявленные в схеме.
- Этот элемент позволяет вам включить в схему атрибуты, не объявленные в схеме.
- Рекурсивные структуры. Типичный пример рекурсивной структуры — иерархия сотрудников и руководителей, в которой одни и те же XML-элементы вложены на нескольких уровнях. В Excel не поддерживаются рекурсивные структуры глубиной более одного уровня.
- Абстрактные элементы. Эти элементы объявляются в схеме, но никогда не используются как элементы. Абстрактные элементы зависят от других элементов, которыми они заменяются.
- Группы подстановки. Эти группы позволяют менять элемент везде, где встречается ссылка на него. Принадлежность элемента к группе подстановки другого элемента указывается с помощью атрибута .
- Смешанное содержимое. Это содержимое объявляется при определении сложного типа с помощью параметра mixed=»true». Excel не поддерживает простое содержимое сложного типа, но поддерживает дочерние теги и атрибуты, определенные в этом сложном типе.
Использование образцов файлов схемы XML и данных XML
В приведенном ниже примере данные содержат базовые элементы и структуры XML, которые можно использовать для проверки сопоставления XML, если отсутствуют XML-файлы или текстовые файлы для создания нужных XML-файлов. Вы можете сохранить этот пример данных в файлы на своем компьютере, сделав следующее.
- Выделите текст примера файла, который требуется скопировать, и нажмите клавиши CTRL+C.
- Запустите Блокнот и нажмите клавиши CTRL+V, чтобы вставить текст примера.
- Нажмите клавиши CTRL+S, чтобы сохранить файл с именем и расширением, указанными для скопированного образца данных.
- Нажмите клавиши CTRL+N в приложении Блокнот и повторите шаги 1–3, чтобы создать файл для текста второго примера.
- Выйдите из Блокнота.
Образец данных XML (Расходы.xml)
Jane Winston 2001-01-01 00012001-01-01 Airfare 500.34 2001-01-01 Hotel 200 2001-01-01 Taxi Fare 100.00 2001-01-01 Long Distance Phone Charges 57.89 2001-01-01 Food 82.19 2001-01-02 Food 17.89 2001-01-02 Personal Items 32.54 2001-01-03 Taxi Fare 75.00 2001-01-03 Food 36.45 2001-01-03 New Suit 750.00 Образец схемы XML (Расходы.xsd)
Создание карты XML
Чтобы создать карту XML, добавьте схему XML в книгу. Можно скопировать схему из файла схемы XML (XSD-файла) или позволить Excel попытаться построить такую схему на основе файла данных XML (XML-файла).

- На вкладке Разработчик выберите команду Источник. Если вкладка Разработчик не отображается, см. раздел Отображение вкладки «Разработчик».
- В области задач Источник XML нажмите кнопку Карты XML, а затем нажмите кнопку Добавить.
- В списке Папка выберите диск, папку или веб-адрес, где расположен нужный файл.
- Щелкните файл, а затем нажмите кнопку Открыть.
- Для файла схемы XML будет создана карта XML, основанная на данной схеме XML. Если откроется диалоговое окно Несколько корней, выберите один из корневых узлов, определенных в файле схемы XML.
- Для файла данных XML Excel попытается определить схему XML на основе данных, а затем создать карту XML.
- Нажмите кнопку ОК. Карта XML отображается в области задач Источник XML.
Сопоставление XML-элементов
XML-элементы сопоставляются с отдельно сопоставленными ячейками и повторяющимися ячейками в XML-таблицах, что позволяет создать связь между такой ячейкой и элементом XML-данных в схеме XML.

- На вкладке Разработчик выберите команду Источник. Если вкладка Разработчик не отображается, см. раздел Отображение вкладки «Разработчик».
- В области задач Источник XML выделите элементы, которые требуется сопоставить. Чтобы выделить несмежные элементы, щелкните один из них, а затем, удерживая нажатой клавишу CTRL, поочередно щелкните все нужные элементы.
- Чтобы сопоставить элементы, выполните указанные ниже действия.
- Щелкните выделенные элементы правой кнопкой мыши и выберите команду Сопоставить элемент.
- В диалоговом окне Сопоставление XML-элементов выберите ячейку и нажмите кнопку ОК.
Совет: Вы также можете перетащить выделенные элементы в то место книги, где они должны отображаться.
- При перетаскивании в книгу неповторяющегося XML-элемента для создания отдельно сопоставленной ячейки отображается смарт-тег с тремя командами, которые позволяют управлять расположением заголовка или подписи. Данные уже содержат заголовок. Выберите этот параметр, чтобы проигнорировать заголовок XML-элемента, так как данная ячейка уже имеет заголовок (слева от данных или над ними). Заголовок XML слева. Выберите этот параметр, чтобы использовать заголовок XML-элемента в качестве подписи ячейки (слева от данных). Заголовок XML сверху. Выберите этот параметр, чтобы использовать заголовок XML-элемента в качестве заголовка ячейки (над данными).
- При перетаскивании в книгу повторяющегося XML-элемента для создания повторяющихся ячеек в XML-таблице имена XML-элементов автоматически используются в качестве заголовков столбцов этой таблицы. Но эти заголовки столбцов можно изменить на любые другие, редактируя ячейки заголовка столбца. В области задач XML-источник нажмите Параметры, чтобы уточнить поведение XML-таблицы. Автоматическое объединение элементов при сопоставлении. Если этот флажок установлен, XML-таблицы будут автоматически расширяться при перетаскивании элемента в ячейку, смежную с этой XML-таблицей. Данные с заголовками. Если этот флажок установлен, существующие данные могут использоваться как заголовки столбцов при сопоставлении повторяющихся элементов листу.
- Если все команды XML затенены и XML-элементы не удается сопоставить с ячейками, возможно, к книге предоставлен общий доступ. Чтобы проверить это и при необходимости отключить общий доступ, на вкладке Рецензирование выберите команду Доступ к книге. Вот как можно сопоставить XML-элементы в книге, которой вы хотите поделиться с другими пользователями: сначала сопоставьте XML-элементы с нужными ячейками, импортируйте данные XML, удалите все карты XML, а затем предоставьте общий доступ к книге.
- Если XML-таблицу с данными не удается скопировать в другую книгу, возможно, XML-таблица имеет связанную карту XML, которая определяет структуру данных. Такая карта XML хранится в книге, но при копировании XML-таблицы в новую книгу карта XML не копируется автоматически. Вместо копирования XML-таблицы Excel создает таблицу Excel с такими же данными. Чтобы превратить новую таблицу в XML-таблицу, сделайте следующее.
- Добавьте карту XML в новую книгу с помощью XML- или XSD-файла, который использовался при создании исходной карты XML. Эти файлы следует хранить, если вы планируете добавлять карты XML в другие книги.
- Сопоставьте эти XML-элементы таблице, чтобы сделать ее XML-таблицей.
- При сопоставлении повторяющегося XML-элемента с объединенной ячейкой Excel отменяет это объединение. Это ожидаемое поведение, так как повторяющиеся элементы предназначены только для работы с ячейками, которые не объединены. С объединенной ячейкой можно сопоставлять отдельные, неповторяющиеся XML-элементы, но сопоставление с такими ячейками повторяющихся XML-элементов (или элементов, содержащих повторяющиеся элементы) не допускается. Объединение ячейки будет отменено, а элемент будет сопоставлен с ячейкой, в которой находится указатель.
- Вы можете отписать XML-элементы, которые не хотите использовать, или запретить перезаписи содержимого ячеек при импорте данных XML. Например, можно временно отменить сопоставление XML-элемента с одной ячейкой или с повторяющимися ячейками, содержащими формулы, которые не должны быть перезаписаны при импорте XML-файла. После завершения импорта вы можете снова соеоставить XML-элемент с ячейками формул, чтобы экспортировать результаты формул в файл данных XML.
- Чтобы отменить сопоставление XML-элемента, щелкните правой кнопкой мыши его имя в области задач Источник XML и выберите команду Удалить элемент.
Отображение вкладки «Разработчик»
Если вкладка Разработчик недоступна, выполните следующие действия, чтобы открыть ее.
- В Excel 2010 и более новых версиях:
- Выберите Файл >Параметры.
- Щелкните категорию Настроить ленту.
- В разделе Основные вкладки установите флажок Разработчик и нажмите кнопку ОК.
- В Excel 2007
- Нажмите кнопку Microsoft Office кнопку >Excel параметры.
- Выберите категорию Основные.
- В разделе Основные параметры работы с Excel установите флажок Показывать вкладку «Разработчик» на ленте и нажмите кнопку ОК.
Разбираем XML средствами Oracle database
Казалось бы, зачем вообще может возникнуть необходимость разбирать XML на стороне БД?
Но на то может быть много причин, и у каждого они могут быть своими. Некоторых, и меня в том числе, вовсе не гнушает реализация прикладной логики средствами БД, а кому-то это кажется архаичным пережитком и полезность инструментария для работы с XML в СУБД, таким людям может показаться сомнительной. Однако, полагаю, мало кто станет возражать в полезности наличия такой возможности на этапе эксплуатации приложения. К примеру — не приняло у нас приложение прайс-лист оптовика — сумбурно выругалось на отсутствие перекодировки по каким-то позициям. Более 20к позиций в XML — поди там разберись, где собака порылась, что конкретно смутило приложение. Согласитесь, ведь тут здорово было бы иметь возможность представить список товаров, перечисленных в XML в виде набора данных, который можно соединить с перекодировочной таблицей, чтобы выявить одним махом все позиции, не имеющие перекодировки? И подобных примеров может быть приведено множество. Мне доводилось заниматься поддержкой приложения, интегрирующегося с внешними системами посредством обмена XML сообщений, и, не смотря на то, что приложение самостоятельно не использовало предоставляемый Oracle инструментарий, он оказался и весьма кстати мне и моим коллегам при поддержке этого продукта.
В этой статье я хотел бы продемонстрировать на сколько легко и непринужденно можно разобрать XML различной степени сложности используя инструментальные средства Oracle Database.
Мне совершенно не хотелось бы здесь касаться DOM парсера. Скажу лишь, что он есть, реализуется пакетом DBMS_XMLDOM. Временами он может оказаться крайне полезным разработчику, а разобраться с ним, не составит труда любому, сталкивавшемуся ранее с DOM парсерами от других производителей.
Инновационной особенностью оракла является тип XMLType и средства работы с ним. Этот тип является частью технологии XML DB, которая включена в поставку Oracle Database начиная с версии 9.2.
Исходный текст документа XML может быть передан конструктору XMLType в виде значений типов CLOB, BLOB, VARCHAR2, BFILE. Пожалуй, стоит отметить, что BFILE позволяет загрузить файл с файловой системы сервера — никак не клиента, потому если наш XML находится на стороне клиента и он достаточно велик, чтобы быть переданным в виде строки в запросе, пожалуй, следует озаботиться возможностью доставки файла с XML содержимым на файловую систему сервера.
Пример создания экземпляра XMLType, с содержимым, передаваемым в строке:
select XMLType( ' ') XML from dualHello world Создав экземпляр XMLType, можно попытаться сделать первые робкие шажки для разбора нашего XML. Тип XMLType реализует метод Extract, который, принимая XPatch выражение, возвращает фрагмент XML, сочетающийся с этим выражением. Фрагмент XML (XML Fragment), в отличии от правильно построенного XML (whellformed XML) допускает отсутствие корневого элемента (или же, другими словами, допускающий более одного корневого элемента в своем составе).
Так в примере ниже, три выражения возвращают три фрагмента XML. Первый возвращает все вхождения элемента word, второй возвращает только первое его вхождение, третий возвращает фрагмент текстового содержимого элемента word, для которого значение атрибута seq равняется двум.
SQL> with demo1 as ( 2 select XMLType( 3 '4 7 ') xml 8 from dual 9 ) 10 select t.xml.extract('//word') case1 11 ,t.xml.extract('//word[position()=1]') case2 12 ,t.xml.extract('//word[@seq=2]/text()') case3 13 from demo1 t; CASE1 CASE2 CASE3 --------------------------- -------------------------- -------Hello 5world 6Hello Hello worldworld Здесь, думаю, стоит поставить жирный акцент на том, что в третьем случае возвращается именно фрагмент XML, никак не значение этого элемента. Различия станут заметны лишь тогда, когда это значение будет содержать подстановочные (escaped) символы, вроде &,>. Для того, чтобы получить значение элемента, следует использовать функцию extractValue. Тут упомяну, что основные методы XMLType, продублированы SQL функциями, или же наоборот, основные функции работы с XMLType реализованы в виде его методов. Однако extractValue — исключение. extractValue представлена только в виде фунации. XMLType, к сожалению, не реализует метод extractValue.
SQL> with demo2 as (select xmltype('<&hello&>') xml from dual) 2 select t.xml.extract('a/text()').getStringVal() case1 3 ,extractValue(t.xml,'a') case2 4 from demo2 t; CASE1 CASE2 --------------------------- -------------------------- <&hello&>Пожалуй, следует еще упомянуть о правилах работы с пространствами имен. Не всякого интуиция приводит к верному пониманию этих механизмов работы. Функции (и метод) extract, extractValue, как один из параметров принимают описание пространства имен. Описанные в этом параметре пространства имен могут быть использованы в XPath выражении. И именно это я хочу подчеркнуть особо. Обратите внимание на третий случай. Пространства имен в XML и XPatch выражениях имеют разные псевдонимы, но одинаковые URI, потому разбор происходит успешно.
SQL> select extractValue(t.xml,'a') case1 2 ,extractValue(t.xml,'a','xmlns="foo"') case2 3 ,extractValue(t.xml,'y:a/@z:val','xmlns:y="foo" xmlns:z="bar"') case3 4 from (select XMLType('a-text') XMl from dual) t; CASE1 CASE2 CASE3 --------------------------- -------------------------- -------------------------- a-text a-valИтак, научившись извлекать значения, теперь следовало бы научиться их разделять. Напомню, в первом случае, для первого примера, мы пытались выбрать все элементы word из XML, и нам это удалось, мы получили два элемента word, однако получили мы их в одном фрагменте. Для того, чтобы представить фрагмент, содержащий несколько корневых элементов в виде последовательности фрагментов, каждый из которых содержит по одному корневому элементу существует конвейерная (pipelined) функция XMLSeqence. Функция возвращает XMLSequenceType, который представляет собой таблицу значений XMLType.
Если вдруг кто запамятовал, напомню, что конвейерные функции возвращают как бы коллекции, потому при вызове оборачиваются выражением table. К результатам этих функций обращаются, используя виртуальный столбец column_value, либо же выражение value(), а потому для табличного выражения(table collection excpression) следует определить псевдоним. Если вдруг кто и не знал этого, рекомендую заучить это как мантру, понимание придет со временем, и то, лишь если понадобится.
Простейший пример использования XMLSequence:
SQL> select extractValue(value(t),'b') result 2 from table(XMLSequence(XMLType('b1b2').extract('a/b'))) t; RESULT ------------------------------------------------------------------------------------- b1 b2Попытаюсь проговорить что здесь происходит, хоть и опасаюсь, что по-русски это окажется намного более сумбурно, и куда менее понятно, нежели на SQL. В выражении from мы сначала создаем экземпляр XMLType, передавая ему строку, содержащую текст XML. Далее, используя метод extract, мы извлекаем в один фрагмент все элементы b, которые содержит элемент а. Полученный фрагмент XML передается параметром в конвейерную функцию XMLSequence, для вызова которой, согласно правилам грамматики, используется предложение table. Набору записей, описываемым этим предложением, присваивается псевдоним t. В select-list’e мы получаем экземпляр объекта возвращенного табличным выражением t, он у нас имеет тип XMLType. Для каждой строки возвращаемой табличным выражением этот экземпляр содержит один фрагмент элемента b исходного XML. Передаем этот объект в качестве параметра функции extractValue. Результат — на лицо.
На самом деле, все далеко не так сложно, как получается в моем изложении. К этому достаточно лишь малость привыкнуть. Но насилие над мозгом еще не в полной степени завершено. То, что у нас получилось на данном этапе, работает только для одного XML документа. Если у нас исходный текст нескольких XML лежит в табличке и нам нужно разобрать сразу несколько из них, нам придется вспомнить еще что такое левая корреляция (left correlation). Здесь тоже нет ничего военного. Эта штука придумана Ораклом и специально для табличных выражений (table collection expression). Суть сводится к тому, что в табличном выражении могут использоваться значения (столбцы) из наборов данных, определенных в выражении from перед (слева) от самого табличного выражения. На практике это выглядит совсем не так ужасно, как на слух:
SQL> with demo3 as(select 1 id, XMLType('b1b2') xml from dual 2 union all select 2 id, XMLType('b3b4') xml from dual) 3 select id xml_id 4 ,extractValue(value(t),'b') result 5 from demo3 s,table(XMLSequence(s.xml.extract('a/b'))) t; XML_ID RESULT ---------- -------------------------------------------------- 1 b1 1 b2 2 b3 2 b4Здесь в табличном выражении t используется значение xml таблицы demo3. Выражение будет вычислено для каждой строки таблицы demo3. Это и есть то самое, что называется таким вычурным словом — левая корреляция.
Описанного функционала вполне достаточно, чтобы разобрать XML практически любой сложности. Этими средствами нельзя разобрать, пожалуй, лишь иерархически представленные данные заведомо неизвестной глубины вложенности. Для разбора подобных структур придется прибегнуть к XSLT, чтобы привести XML к более удобочитаемому виду. XSLT преобразование осуществляется функцией XMLTransform, которая в качестве первого параметра принимает XMLType исходного документа, второго XMLType XSL шаблона, а возвращает XMLType результата преобразования.
В принципе, на этом с теорией можно и закончить. В завершение лишь продемонстрирую пример извлечения элементов с разных уровней вложенностей XML. У новичков это, порой, вызывает сложности.
SQL> with demo4 as( 2 select XMLType( 3 '4 ' 33 ) xml from dual) 34 select extractValue(s.xml,'master/id') master_id 35 ,extractValue(value(dtl),'detail/id') detail_id 36 ,extractValue(value(subdtl),'sub_detail/id') sub_detail_id 37 from demo4 s 38 ,table(XMLSequence(s.xml.extract('master/details/detail'))) dtl 39 ,table(XMLSequence(value(dtl).extract('detail/sub_details/sub_detail')))(+) subdtl; MASTER_ID DETAIL_ID SUB_DETAIL_ID --------------------------- -------------------------- -------------------------- mater id detail 1 id sub_detail 1.1 id mater id detail 1 id sub_detail 1.2 id mater id detail 2 id sub_detail 2.1 id mater id detail 2 id sub_detail 2.2 id mater id detail 3 idmater id 56327 17detail 1 id 89 1610 12sub_detail 1.1 id 1113 15sub_detail 1.2 id 1418 28detail 2 id 1920 2721 23sub_detail 2.1 id 2224 26sub_detail 2.2 id 2529 31detail 3 id 30Как видите, здесь нет ничего нового. Все та же левая корреляция. Единственное, на что хотелось бы обратить внимание, на (+) в конце табличного выражения subdtl. Как, наверное, не сложно догадаться, он обозначает, что следует использовать внешнее соединение. Если бы мы его не указали, мы не получили бы строки с detail 3.
Итак, что же предстало пред нашими глазами? Мы имеем один объектный тип, сравнительно ограниченный набор функций, дающий практически не ограниченный набор возможностей. Мне безумно нравится эта реализация. Особенно меня восторгает то, что Oracle corp не пришлось рихтовать семантику их SQL, чтобы вписать в него XML. Все описанные особенности — объекты, конвейерные функции, табличные выражения используются этой технологией, но не созданы специально для нее. Получается, подобную реализацию мог бы воплотить кто угодно. Эта реализация жирной линией подчеркивает мощь и гибкость ораклиного SQL движка.
На этой ноте я мог бы и закончить, однако мне покоя не дает предвосхищаемый мною вопрос, да с упреком. «Дружище, ты в каком веке вообще живешь, ты на календарь давно заглядывал? На дворе близится к концу 2011й год, уже далеко не первый продакшн поднят на 11r2 версии датабазы, а ты все жуешь девятошный функционал». Да, есть такой грешок за мной. Я прекрасно знаю, что в 10й версии ввели чудный XMLTable, полностью задвигающий на задний план только что описанный мною функционал. Позволяющий еще легче и еще более не принужденно разбирать XML. Однако по XMLTable у меня еще не достаточно опыта, чтобы сказать что либо сверх и без того очевидного. Потому ограничусь лишь простой демонстрацией.
Покажу на том же примере:
34 select master_id 35 ,details_id 36 ,sub_details_id 37 from demo4 s 38 ,XMLTable('master' 39 passing (s.xml) 40 columns master_id varchar2 (20) path 'id' 41 ,details XMLType path 'details/detail') mstr 42 ,XMLTable('detail' 43 passing (mstr.details) 44 columns details_id varchar2 (20) path 'id' 45 ,sub_details XMLType path 'sub_details/sub_detail')(+) dtl 46 ,XMLTable('sub_detail' 47 passing (dtl.sub_details) 48 columns sub_details_id varchar2 (20) path 'id')(+) sub_dtl; MASTER_ID DETAILS_ID SUB_DETAILS_ID --------------------------- -------------------- -------------------- mater id detail 1 id sub_detail 1.1 id mater id detail 1 id sub_detail 1.2 id mater id detail 2 id sub_detail 2.1 id mater id detail 2 id sub_detail 2.2 id mater id detail 3 idКазалось бы, букв стало много больше, может возникнуть справедливый вопрос… а в чем же профит инновации? Профит в том, что первым параметром в XMLTable передается уже не XPath выражение, а XQuery. А значит, объединение может быть произведено именно его средствами, а не средствами SQL. XMLTable обещает быть еще той вкуснятиной, но, увы, повторюсь, мне о нем пока нечего рассказать.
