XML (eXtensible Markup Language) é uma recomendação da W3C para gerar linguagens de marcação para necessidades especiais.
É um dos subtipos da SGML (acrônimo de Standard Generalized Markup Language ou Linguagem Padronizada de Marcação Genérica) capaz de descrever diversos tipos de dados. Seu propósito principal é a facilidade de compartilhamento de informações através da internet.
2. Introdução ao XML
eXtensible Markup Language – O recomendado pela W3C para usar como
linguagem de marcação.
Documentos organizados hierarquicamente.
**W3C, ou World Wide Web Consortium, é um consórcio de empresas de tecnologia
que visa padronizar a criação e interpretação de conteúdos para websites.
3. Linguagem de Marcação?
HTML – HyperText Markup Language é uma linguagem para organizar e formatar
um website.
XML – eXtended Markup Language padroniza uma sequência de dados com o
objetivo de organizar, separar o conteúdo e integrá-lo com outras linguagens.
4. Características do XML
Sintaxe simples.
Compartilhamento de informações entre diferentes computadores e aplicações.
Integração com outras linguagens.
Portabilidade: um BD pode escrever um arquivo XML para que outro BD consiga
lê-lo.
6. XML vs Relacional
phone phone phone
{ row: { name: “John”, phone: 3634 },
row: { name: “Sue”, phone: 6343 },
row: { name: “Dick”, phone: 6363 }}
name phone
John 3634
Sue 6343
Dick 6363
row row row
name name name
“John” 3634 “Sue” 6343 “Dick” 6363
Relation
… in XML
7. Projeto de um BD XML
Especificação de requisitos: levantamento das necessidades de dados.
Modelagem conceitual: uso de um modelo de dados convecional, ex. ER.
Modelagem lógica: uso de um modelo de dados baseado em grafo, adequado à
representação de uma hierarquia XML.
Modelagem física: especificação do esquema XML.
8. Banco de Dados com suporte XML
Tem ferramentas que convertem o conteúdo XML para um banco de dados
tradicional.
Aceita XML como entrada
Rederiza XML como saída
Ex: Postgre tem um biblioteca interna de manipulação XML
10. Banco de Dados com XML nativo
Define um modelo lógica para um documento XML, e armazena e recupera de
acordo com este modelo.
Possui um documento como unidade fundamental de armazenamento lógico.
Especilizado em armazenar dados XML, armazena todos os componenetes do
modelo XML (elementos, atributos, etc).
11. Benefícios
Suporta transações.
Acesso integrado a legados.
Suporte à distribuição.
Escalabilidade para grandes volumes.
Tem melhor desempenho que SGBDs padrão.
12. BD com suporte XML X nativo XML
Qual a vantagem de cada um?
13. BD XML X BD comum
Qual a vantagem de se utilizar um BD XML?
14. BD XML X BD comum
Mas... Por que utilizar XML?
Vamos supor uma empresa X que possui um conjunto de dados que precisa
ser disponibilizados para a empresa parceira Y. Como fazer isso de maneira simples?
15. XML!
<?xml version=”1.0″
encoding=”ISO-8859-1″ ?>
<pedidos>
<pedido id=”1″>
<item descrição=”1″ qtde=”100″ />
<item descrição=”2″ qtde=”20″/>
</pedido>
<pedido id=”2″>
<item descrição=”1″ qtde=”25″ />
<item descrição=”3″ qtde=”10″/>
<item descrição=”4″ qtde=”50″/>
</pedido>
<descrições>
<descrição id=”1″>Pacote de papel sulfite</descrição>
<descrição id=”2″>Pacote de papel carbono</descrição>
<descrição id=”3″>Caixa de grampos</descrição>
<descrição id=”4″>Borracha branca</descrição>
</descrições>
</pedidos>
16. Por que não usar XML?
Suponha que exista a necessidade de se transmitir o valor de determinados items,
e cada item possui um identificador. E agora?
18. Mas...
E se eu precisasse passar o valor de milhares de itens?
A quantidade de informação real (somente dos dados) que está sendo fornecida é
bem menor comparada à quantidade de informações “extras” (tags) contidos no
arquivo.
E também, não existe necessidade alguma dessa lista ser descrita
hierarquicamente.
21. Técnica Edge
Consiste em armazenar todos os documentos em uma única tabela chamada Edge
Edge(source, ordinal, name, flag, target)
Id que indica o documento
XML
N º para preservar a ordem
entre os elementos de um
mesmo documento.
Nome do elemento ou
atributo
22. Técnica Edge
Consiste em armazenar todos os documentos em uma única tabela chamada Edge
Edge(source, ordinal, name, flag, target)
Para armazenar os valores, uma tabela Vpara cada tipo
Vtype(vid, value)
24. SGBDs XML Híbridos
Suporte a armazenamento de docs. XML em sua forma nativa, ao mesmo tempo
em que mantém suporte a armazenamento de dados relacionais/objeto-relacionais
Oracle: tem suporte a SQLX
31. XMLForest()
Gera uma lista de elementos XML a partir de uma lista de expressões de valor e
seus aliases opcionais. Valores nulos não geram elementos XML.
XMLFOREST (
expressão_valor [AS alias]
[, expressão_valor [AS alias] ]*
)
32. XMLForest()
SELECT XMLFOREST(
CLI.CNOME AS "NOME",
CLI.CCIDADE AS "CIDADE",
CLI.CEP AS "CEP"
)
FROM CLIENTES_REL CLI
WHERE CLI.CESTADO = 'CE'
<NOME>Lineu</NOME>
<CIDADE>Fortaleza</CIDADE>
<CEP>60356-030</CEP>
<NOME>Valdiana</NOME>
<CIDADE>Fortaleza</CIDADE>
<CEP>60486-025</CEP>
33. XMLAgg()
Gera uma lista de elementos XML a partir de um agrupamento (GROUP BY). Se
nenhum GROUP BY for especificado, é retornado um agregado XML para todas as
cláusulas da consulta.
XMLAGG (
instância_elemento_XML
[ GROUP BY lista_atributos ]
)
34. XMLAgg()
SELECT XMLELEMENT("CLIENTES",
XMLATTRIBUTES(CLI.CCIDADE AS "CIDADE")
XMLAGG(
XMLELEMENT("CLIENTE",
CLI.CNOME )
)
)
FROM CLIENTES_REL CLI
GROUP BY CLI.CCIDADE;
<CLIENTES CIDADE="FORTALEZA">
<CLIENTE>Lineu</CLIENTE>
<CLIENTE>Valdiana</CLIENTE>
</CLIENTES>
<CLIENTES CIDADE="SOBRAL">
<CLIENTE>Marta</CLIENTE>
<CLIENTE>Joana</CLIENTE>
</CLIENTES>
39. Outras Funções
XMLElement() Creates an XML Element.
XMLForest()Creates an XML Fragment from passed-in components.
XMLColAttVal() Creates an XML fragment and then expands the resulting XML so
that each XML fragment has the name "column" with the attribute "name"
ExtractValue() Takes as arguments anXMLTypeinstance and an XPathexpression
and returns a scalar value of the resultant node.
XMLTransform() Takes as arguments anXMLTypeinstance and an XSL style sheet,
which is itself a form ofXMLTypeinstance. It applies the style sheet to the instance
and returns anXMLType.
XMLSequence() Takes input and returns either a varrayof the top-level nodes in
theXMLType, or anXMLSequencetype an XML document for each row of the cursor.
XMLConcat() Takes as input a series ofXMLTypeinstances, concatenates the series
of elements for each row, and returns the concatenated series.
UpdateXML() Takes as arguments anXMLTypeinstance and an XPath-value pair,
and returns anXMLTypeinstance with the updated value.
40. XPath
Os principais operadores da XPath são / e //. O primeiro serve para dar um passo
na árvore XML, enquanto o segundo serve para pular vários níveis de uma só vez.
Funciona de maneira parecida como se fosse uma árvore de diretórios. O resultado
de cada expressão XPath é um conjunto de elementos especificados pelo caminho.
41. XPath
<?xml version="1.0" encoding="ISO-8859-1"?> <catalog> <cd
country="USA"> <title>Empire Burlesque</title>
<artist>Bob Dylan</artist> <price>10.90</price> </cd> <cd
country="UK"> <title>Hide your heart</title>
<artist>Bonnie Tyler</artist> <price>9.90</price> </cd> <cd
country="USA"> <title>Greatest Hits</title>
<artist>Dolly Parton</artist> <price>9.90</price> </cd>
</catalog>
A expressão XPath abaixo seleciona o elemento RAIZ catalog: /catalog
A expressão XPath abaixo seleciona todos os elementos cd do elemento
catalog: /catalog/cd
A expressão XPath abaixo seleciona todos os elementos price de todos os
elementos cd do elemento catalog: /catalog/cd/price
42. Xpath: Selecionando elementos
desconhecidos
A expressão XPath a seguir seleciona todos os elementos filhos de todos os
elementos cd do elemento catalog: /catalog/cd/*
A expressão XPath a seguir seleciona todos os elementos price que são elementos
netos do elemento catalog: /catalog/*/price
A expressão XPath a seguir seleciona todos os elementos price que têm dois
ancestrais: /*/*/price
A expressão XPath a seguir seleciona todos os elementos no documento: //*
43. Xpath: Selecionando seções
Usando-se colchetes numa expressão XPath você pode especificar um elemento
adiante.
A expressão XPath a seguir seleciona o primeiro elemento cd filho do elemento
catalog: /catalog/cd[1]
A expressão XPath a seguir seleciona o último elemento cd filho do elemento
catalog (Nota: não existe a função first()): /catalog/cd[last()]
A expressão XPath a seguir seleciona todos os elementos cd do elemento catalog
que tem um elemento price: /catalog/cd[price]
A expressão XPath a seguir seleciona todos os elementos cd do elemento catalog
que tem um elemento price com valor de 10.90: /catalog/cd[price=10.90]
A expressão XPath a seguir seleciona todos os elementos price de todos os
elementos cd do elemento catalog que tem um elemento price com valor de
10.90: /catalog/cd[price=10.90]/price
44. Xpath: Selecionando vários caminhos
Usando o operador "|" numa expressão XPath você pode selecionar vários
caminhos.
A expressão XPath a seguir seleciona todos os elementos title e artist do elemento
cd do elemento catalog: /catalog/cd/title | /catalog/cd/artist
A expressão XPath a seguir seleciona todos os elementos title e artist do
documento: //title | //artist
A expressão XPath a seguir seleciona todos os elementos title, artist e price do
documento: //title | //artist | //price
A expressão XPath a seguir seleciona todos os elementos title do elemento cd do
elemento catalog, e todos os elementos artist no documento: /catalog/cd/title |
//artist
45. Atributos no XPath
Esta expressão XPath seleciona todos os atributos chamados country: //@country
Esta expressão XPath seleciona todos os elementos cd que tem um atributo
chamado country: //cd[@country]
Esta expressão XPath seleciona todos os elementos cd que tem algum
atributo: //cd[@*]
Esta expressão XPath seleciona todos os elementos cd que tem um atributo
chamado country com valor 'UK': //cd[@country='UK']
46. Xquery: FLWOR Expressions
FOR-LET-WHERE-ORDERBY-RETURN = FLWOR
FOR/LET Clauses
List of tuples
WHERE Clause
List of tuples
ORDERBY/RETURN Clause
Instance of XQuery data model
47. Xquery: For vs Let
FOR $x IN list-expr
Binds $x in turn to each value in the list expression.
LET $x = list-expr
Binds $x to the entire list expression,
Useful for common sub-expressions and for aggregations.
48. For
FOR iterates over an input sequence and calculates some value for each item in
that sequence, returning a sequence obtained by concatenating the results of these
calculations.
In simple cases there is one output item for every input item. So:
for $n in (1 to 10)
return $n * $n
Returns the sequence (1, 4, 9, 16, 25, 36, 49, 64, 81, 100).
49. Let
The XQuery LET clause simply declares a variable and gives it
a value:
let $maxCredit := 3000
let $overdrawnCustomers := //customer[overdraft > $maxCredit]
return count($overdrawnCustomers)
In this example you can simply replace each variable reference
by the expression that provides the expression's value.
This means that the result is the same as:
count(//customer[overdraft > 3000])
50. Exemplo 1:
FOR $x IN document("bib.xml")/bib/book
RETURN <result> $x </result>
Returns:
<result> <book>...</book></result>
<result> <book>...</book></result>
<result> <book>...</book></result>
...
LET $x IN document("bib.xml")/bib/book
RETURN <result> $x </result>
FOR generates a list of bindings
of $x to each book element in
the bib.
Returns:
<result> <book>...</book>
<book>...</book>
<book>...</book>
...
</result>
LET generates a single binding
of $x to the list of book
elements in the bib.
51. Exemplo 2:
Find all book titles published after 1995:
FOR $x IN document("bib.xml")/bib/book
WHERE $x/year > 1995
RETURN $x/title
Result:
<title> abc </title>
<title> def </title>
<title> ghi </title>
52. Exemplo 3:
For each author of a book by Morgan Kaufmann,
list all books they have published:
FOR $a IN distinct(document("bib.xml")
/bib/book[publisher=“Morgan Kaufmann”]/author)
RETURN <result>
$a,
FOR $t IN /bib/book[author=$a]/title
RETURN $t
</result>
distinct = a function that eliminates duplicates (after
converting inputs to atomic values).
53. Exemplo 4:
<result>
<author>Jones</author>
<title> abc </title>
<title> def </title>
</result>
<result>
<author> Smith </author>
<title> ghi </title>
</result>
Observe how the nested
structure of result
elements is determined by
the nested structure of the
query.
FOR $t IN /bib/book[author=$a]/title
54. Where
Primeiro defina todas as tabelas de interesse e depois defina o where:
for $genre in //genre/choice
for $video in //video
for $actorRefs in $video/actorRef
for $actor in //actor
where $video/genre = $genre and $actor/@id = $actorRefs
return concat($genre, ": ", $actor)
55. Exemplo 5
<big_publishers>
FOR $p IN distinct(document("bib.xml")//publisher)
LET $b := document("bib.xml")/book[publisher = $p]
WHERE count($b) > 100
RETURN $p
</big_publishers>
For each publisher p
- Let the list of books
published by p be b
Count the # books in
b, and return p if b >
100
count = (aggregate) function that returns the number of elements
56. Exemplo 6
Find books whose price is larger than average:
LET $a=avg(document("bib.xml")/bib/book/price)
FOR $b in document("bib.xml")/bib/book
WHERE $b/price > $a
RETURN $b
avg() == aggregate function
57. Orderby
Muito semelhante ao SQL padrão
for $x in //video
order by $x/year ascending, number($x/user-rating) descending
return $x/title
58. Return
O return no Xquery define quais resultados serão exibidos, por exemplo:
for $v in //video[genre="comedy"]
return //actor[@id = $v/actorRef]
59. Sorting
<publisher_list>
FOR $p IN distinct(document("bib.xml")//publisher)
ORDERBY $p
RETURN <publisher> <name> $p/text() </name> ,
FOR $b IN document("bib.xml")//book[publisher = $p]
ORDERBY $b/price DESCENDING
RETURN <book>
$b/title ,
$b/price
</book>
</publisher>
</publisher_list>
60. If-then-else
FOR $h IN //holding
ORDERBY $h/title
RETURN <holding>
$h/title,
IF $h/@type = "Journal"
THEN $h/editor
ELSE $h/author
</holding>