Подход к реализации xquery Паращенко Олег...
TRANSCRIPT
Подход к реализации XQuery
Паращенко Олег
Санкт-Петербургский Государственный Университет
Обнинск, 2004
XML<article id="hw"> <title>Hello</title> <para>Hello, <object>World</object>!</para></article>
article
/
title para@id
object“hw” “Hello” “Hello, ” “!”
“World”
<usr> <bin> <cat/> <echo/> <xmllint/> … </bin> <lib> … </lib></usr>
Простой XPath
Похож на путь к файлу
/usr/bin/xmllint
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/></AAA>
Простой XPath
Результат —множество узлов
/AAA/CCC
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB/> <BBB/> </DDD> </CCC></AAA>
//
Поиск по всемуподдереву
//DDD/BBB
<AAA> <XXX> <DDD> <BBB/> <EEE/> <FFF/> </DDD> </XXX> <CCC> <XXX> <BBB/> <BBB/> <EEE/> <FFF/> </XXX> </CCC></AAA>
*
Любое имя
/AAA/*/*/BBB
<AAA> <BBB id="b1"/> <BBB id="b2"/> <BBB name="bbb"/> <BBB/></AAA>
@
Атрибут
//BBB/@name
Оси навигации
child::enamedescendant::enameparent::node()attribute::anameself::node()ancestorfollowing-siblingpreceding-sibling…
ename//ename..@aname.
Фильтрация
<AAA> <BBB/> <BBB/> <BBB/> <BBB/></AAA>
<AAA> <BBB/> <BBB/> <BBB/> <BBB/></AAA>
(/AAA/BBB)[1] (/AAA/BBB)[last()]
Фильтрация, функции
//bin[vim]
//openssh[.//sshd[@date<20040923]]
//bin/*[contains(name(), 'vi')]
Запросы не для XPath
Обратные ссылки/... /xxx//... /yyy//... [..?xxx..?yyy...]
Создание элементов,переименование
Пример XQuery
<example> <p> Here is a query. </p> <eg> doc("books.xml")//book[1]/title </eg> <p> Here is the result of the above query.</p> <eg>{ doc("books.xml")//book[1]/title }</eg></example>
<example> <p> Here is a query. </p> <eg> doc("books.xml")//book[1]/title </eg> <p> Here is the result of the above query.</p> <eg><title>TCP/IP Illustrated</title></eg></example>
FLWOR (“flower”) expressions
for—let—where—order by—return
for $i in (1, 2, 3)return <tuple><i>{ $i }</i></tuple>
<tuple><i>1</i></tuple><tuple><i>2</i></tuple><tuple><i>3</i></tuple>
define function toc($book-or-section as element()) as element()*{ for $section in $book-or-section/section return <section> { $section/@* , $section/title , toc($section) } </section>}<toc> { for $s in doc("xquery-book.xml")/book return toc($s) }</toc>
Функции
Ресурсы
Спецификации
А.Валиков “Технология XSLT”
http://xmlhack.ru/
“XQuery from the Experts: A Guide to the W3C XML Query Language” by Howard Katz, D. D. Chamberlin
http://zvon.org/
Подход к реализации XQuery
Паращенко Олег
Санкт-Петербургский Государственный Университет
Обнинск, 2004
(продолжение)
XPath vs “вручную”get_elem("elemname[i]") vs/** * Returns child element at given position. Position can be * negative. In this case nodes are counting from end. * Last node position is '-1'. * @param node parent node * @param name name of node, null if not important * @param pos position of node starting from zero, can be negative */public static Element getChildElement (Element node, String name, int s) { // // Update position to be always positive. // boolean fromEnd = pos < 0; if (fromEnd) { pos = -(pos + 1); } // // Initialize // Node cur_node = fromEnd ? node.getLastChild(): node.getFirstChild(); int cur_pos = -1; // // Walk on children //
for (; cur_node != null; cur_node = (fromEnd ? cur_node.getPreviousSibling() : cur_node.getNextSibling ())) { // // Check that current node is of type 'element' // if (cur_node.getNodeType() != Node.ELEMENT_NODE) { continue; } // // Get element, check its name and position // Element cur_elem = (Element)cur_node; if ((name != null) && (! name.equals (cur_elem.getTagName()))) { continue; } cur_pos++; if (cur_pos == pos) { return cur_elem; } } // // If node was found, it was returned from inside loop // return null;}
XPath vs “вручную”
наглядность
меньше кода – меньше ошибоки дополнительных расходов
менее 1 минутыvs
более 2 часов
Программы с деревьями
findтекстовые процессорыкомпиляторы, интерпретаторы
встроенный xpath/xquery —“серебрянная пуля”
Единая реализацияБиблиотеки C vs Java vs .NET vs …
Виртуальная машина● Реализация XQuery на удобном языке программирования● Байт-код ВМ● Интерпретатор ВМ
Готовые реализации● CL-XML● SXML/SXPath/SXQuery
Удобный язык● Common Lisp или Scheme
SXML
<article id="hw"> <title>Hello</title> <para>Hello, <object>World</object>!</para></article>
(*TOP* (article (@ (id "hw")) (title "Hello") (para "Hello, " (object "World") "!")))
S-exp:
XML:
SXPath
((txpath "//TAF/VALID/@TRange/text()") document)
((sxpath '(// TAF VALID @ TRange *text*)) document)
((node-join (node-closure (node-typeof? 'TAF)) (select-kids (node-typeof? 'VALID)) (select-kids (node-typeof? '@)) (select-kids (node-typeof? 'TRange)) (select-kids (node-typeof? '*text*))) document)
Части системы
SXQuery XQuery VM
макрораскрытие, компиляция
В программе:Интерпретатор ВМ
Привязка (bindings)
Парсер XML, XPath, XQuery
Этапы развития
Сейчас – проверка идеи
v.0.1: Python AST
v.1.0: Docbook XSLT
Похожие системы
Частично – любая реализацияXPath/XQuery
XSLTC от Oracle
Оптимизация
(//ename)[1]
ВМ как исходный код
e1 := _X(doc, “AAA//BBB/CCC”)e2 := _X(doc, “AAA//BBB/DDD”)
t1 := child(doc, “AAA”)t2 := descendant(t1, “BBB”)e1 := child(t2, “CCC”)t3 := child(doc, “AAA”)t4 := descendant(t3, “BBB”)e2 := child(t4, “DDD”)
t1 := child(doc, “AAA”)t2 := descendant(t1, “BBB”)e1 := child(t2, “CCC”)e2 := child(t2, “DDD”)
Другие ВМ
Java VM
.NET VM
LLVM
Подход к реализации XQuery
Паращенко Олег
Санкт-Петербургский Государственный Университет
Обнинск, 2004