Маніпулювання даними XML

Тепер перейдемо до питання про мови маніпулювання даними XML Було запропоновано багато таких мов, але стандартним, мабуть, має стати XQuery [2729] Як буде незабаром показано, мова XQuery (робота над яким до часу написання даної книги ще не була закінчена) заснований на декількох більш ранніх мовах, включаючи, зокрема, XPath [2727] насправді, мова XQuery повністю включає в себе XPath

Мова XQuery забезпечує тільки читання Оновлення в разі необхідності повинно виконуватися або із застосуванням моделі DOM [2724], або за допомогою деяких спеціалізованих засобів (надаються окремими постачальниками), але, безумовно, обидва ці підходи характеризуються певними недоліками, як зазначено нижче

■ Недоліком моделі DOM є те, що вона (як зазначено в розділі 273) пред призначена для програмістів, а не для кінцевих користувачів

■ Недоліком спеціалізованих засобів є саме те, що вони специали зірованние, і кожен постачальник реалізує їх не так, як інші (Тим не менш, в розділі 277 описано, які функціональні можливості вони зазвичай предос тавляют)

В даний час ведеться розробка мови, не залежного від конкретних постачальників, який називається XUpdate [2730], але до часу написання даної книги ці роботи ще перебували на попередньому етапі, тому розглядати тут цей

мову було б ще занадто рано У звязку з цим обмежимося описом в даному розділі тільки мови XQuery (і XPath)

Мова XQuery стався від раніше створеного мови Quilt [279], на який в свою чергу вплинули SQL, OQL і деякі більш старі мови з сімейства мов XML, в тому числі XQL, XML-QL і Lorel (опис мови OQL наведено в [2511], а інформація, що стосується XQL, XML-QL і Lorel, наведена в [275] і [2518]) Відзначимо, що в цілому мова XQuery є досить розвиненим і складним, тому в книзі такого характеру, як дана, немає сенсу намагатися привести його вичерпний опис У звязку з цим тут просто показано низку прикладів з коментарями, яких, на думку автора, має бути достатньо, щоб отримати загальне уявлення про можливості, області застосування і характер цієї мови Але перш ніж приступити до вивчення цих прикладів, необхідно відзначити, що мова XQuery насправді взагалі не оперує з документами XML як такими Причини цього перераховані нижче

■ По суті, документи XML, згідно з визначенням, являють собою символьні рядки, які (крім усього іншого) призначені для читання людьми

■ У силу цього вони включають безліч таких особливостей, як дескриптори, обо значення кінця рядка, відступи і тд, які дозволяють досягти такої мети, як підвищення зручності читання, але не мають ніякого відношення до реального інформаційного наповнення розглянутого документа

■ Сама мова XQuery насправді призначений для забезпечення доступу саме до інформаційного наповнення

Тому мова XQuery визначена як мова, призначений для функціонування не в термінах документів XML як таких, а скоріше в термінах документів XML, які перетворені в деяку абстрактну форму (Отриману в результаті обробки документа синтаксичним аналізатором) Абстрактна форма будь-якого конкретного документа XML називається екземпляром моделі даних XQuery [2729] її можна розглядати як інфонабор18 (тобто як структурну ієрархію), аналогічний наведеному на рис 272 (у підрозділі Структура документа XML розділу 273) Тому заслуговує особливої ​​уваги те, що результат запиту, вираженого на мові XQuery, являє собою інфонабор, а не документ XML В [2729] про це сказано так: В даний час питання про те, як забезпечити [зворотне] перетворення примірника моделі даних в документ XML, залишається відкритим . Насправді, результат обчислення виразу XQuery може навіть виявитися не строго певним інфонабором, оскільки (як буде показано нижче) він може навіть не бути формально правильним

Мова XPath

У мові XQuery широко використовуються характерні вирази – позначення шляху (path expression) мови XPath, тому почнемо з короткого опису таких виразів Концептуально ці вирази зберігають суворе подобу позначенням шляху, які описані в розділах 25 і 26 А саме, позначенням шляху в мові Xpath є такий вираз, який дозволяє, починаючи від деякого зазначеного вихідного вузла (або вузлів)

18 Точніше, ця абстрактна форма складається з доповненого інфонабора, званого інфонабором, отриманим після перевірки за схемою (Post Schema Validation Infoset – PSVI), який перетворений у форму моделі даних XQuery

в деякому заданому інфонаборе пройти по заданому шляху (або шляхах) в цьому інфонаборе, щоб знайти певний бажаний цільової вузол (або вузли)

Примітка Терміни вихідний вузол і цільової вузол не є офіційно прийнятими термінами мови XPath

Тому синтаксична конструкція позначення шляху XPath являє собою послідовність кроків, в якій кожен крок, за винятком першого, відділений від попереднього косою рискою (/), а перед першим кроком можуть бути додатково введені один або два символи косою риси, як показано нижче

[/ \/  /  ]  step/step / ../ step

Початкова одинарна коса риска означає, що переміщення починається від кореневого вузла (тобто, вихідним вузлом є кореневий вузол) початкова подвійна коса риска означає, що пошук повинен починатися з кожного вузла по черзі (по суті, застосування подвійної косої межі викликає перегляд всього інфонабора в режимі пошуку в глибину, зліва направо, в якому кожен вузол по черзі виконує роль вихідного вузла) Якщо ж у позначенні шляху взагалі немає початковій косою риси, то в якості вихідного вузла застосовується поточний вузол (тобто вузол, доступ до якого був виконаний останнім за часом)

Нижче наведено кілька простих прикладів, заснованих на документі PartsRelation з підрозділу Визначення типу документа розділу 274 (нагадаємо, що цей

документ містить елементи PartTuple з даними про деталі P1, P2 і РЗ):

■ Наведене нижче вираз повертає послідовність вузлів, відпо вующих цим трьом елементам PartTuple

/PartsRelation/PartTuple

Наведене нижче вираз повертає порожню послідовність вузлів, оскільки кореневий вузол не має дочірніх узловРаrТuр1е / PartTuple

Примітка У даному випадку кореневим вузлом є не вузол PartsRelation, a швидше вузол всього документа (див опис рис 272 в розділі 273) Таке ж зауваження, безумовно, відноситься як до попереднього прикладу, так і до наступного

■ Наведене нижче вираз повертає той же результат, що і вираз з першого прикладу

//PartTuple

Взагалі кажучи, кожен крок у заданому позначенні шляху виконується в контексті результатів попереднього кроку (точніше, якщо результат попереднього кроку являє собою послідовність вузлів SN, то кожен вузол з SN в свою чергу стає контекстним вузлом для поточного кроку) Кожен крок складається з трьох перерахованих нижче частин

1 Вісь, визначальна напрям, в якому повинно тривати переміщення

Найчастіше переміщення триває в напрямку вгору, по осі батьківського вузла (parent) або вузла-предка (ancestor), вниз, по осі дочірнього вузла (child) або вузла-нащадка (descendant), вліво, по осі попереднього вузла

(Preceding) або попереднього сестринського вузла (preceding-sibling), і

вправо, по осі наступного вузла (following) або наступного сестринського вузла

(fol l o w i ngsi b l i ng)

2 Вираз для перевірки вузла, яке визначає тип (типи) вузла (вузлів), пред ставлять інтерес для пошуку

3 В якості необовязкового компонента застосовуються один або кілька преди катів, які служать для виключення непотрібних вузлів

Примітка Конкретні батьківські (Parent), дочірні (Child) та інші осі, перераховані в першому пункті, не вичерпують усіх можливостей – вони зазначені просто в якості ілюстрації Якщо не визначена жодна вісь, то за замовчуванням застосовується вісь child (тобто в процесі переміщення відбувається перехід до дочірніх вузлів контекстного вузла)

Для того щоб вивчити, як відбувається обробка позначень шляху, розглянемо наступний трохи складніший приклад

/PartsRelation/PartTuple[WEIGHT=&quot170&quot]

Пояснення

1 Початковий символ / вказує кореневий вузол (тобто вузол документа) в якос стве контекстного вузла для кроку, безпосередньо наступного за цим символом

2 Позначення шляху можуть записуватися (і зазвичай записуються) у скороченій формі Тому в даному прикладі вираз PartsRelation є зі припиненням від виразу child :: PartsRelation (Де child-ось, а PartsRelation – вираз для перевірки вузла) Таким чином, результатом

цього кроку є вузол PartsRelation – єдиний дочірній вузол кореневого вузла

3 Аналогічним чином, PartTuple – Це скорочення від child :: PartTuple; виконання цього кроку призводить до отримання послідовності з трьох вузлів PartTuple, які є дочірніми по відношенню до вузла PartsRelation

4 Нарешті, предикат [WEIGHT = 17 0 ] Виключає всі вузли PartTuple, крім уз ла, в якому дочірній елемент WEIGHT має значення 170

Примітка Вираз WEIGHT саме є скороченням цей предикат в повній формі має наступний вигляд

[child::WEIGHT=&quot170&quot]

Тому остаточним результатом стає послідовність з двох вузлів

PartTuple, відповідних деталям Р2 і РЗ (у зазначеному порядку)

На завершення цього короткого опису мови XPath, необхідно відзначити, яку важливу роль у всіх представлених вище процедурах грає поняття поточного становища. Було показано, що кожен крок у будь-якому конкретному позначенні шляху виконується по відношенню до деякого контекстного вузлу, який служить в якості поточного вузла. Відзначимо, що досить схоже поняття переважало в мовах доступу в тих ранніх системах з керованою вручну навігацією (Особливо ієрархічних системах), які домінували на ринку СУБД до появи на сцені систем SQL Саме в цьому понятті полягала безпосередня причина багатьох складнощів

(Не кажучи вже про помилки кодування), від яких страждали подібні Системи безус ловно, одним з багатьох значних досягнень, повязаних з впровадженням Реляційних ної моделі, стало те, що вона дозволила повністю виключити поняття поточного становища. Тому, безумовно, слід поставити під сумнів всю мудрість по вторн запровадження зазначеного поняття (і, більше того, застосування його як ключі вого засоби)

Джерело: Дейт К Дж, Введення в системи баз даних, 8-е видання: Пер з англ – М: Видавничий дім «Вільямс», 2005 – 1328 с: Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*