Banco de Dados XML
Diego A. Lusa,
Mateus H. Dal Forno
Universidade de Passo Fundo
Programa de P´os Gradua¸c˜ao em Computa¸c˜ao Aplicada - PPGCA
14 de novembro de 2014
1 / 37
Sum´ario
1. Conceitos B´asicos
2. Oracle XML DB
2 / 37
XML - eXtensible Markup Language
Linguagem criada para descrever dados
´E uma linguagem de marca¸c˜ao que n˜ao apresenta um conjunto de
tags pr´e-definidas
´E extens´ıvel e muito utilizada na Web e em arquiteturas SOA
Exemplo
<?xml version="1.0" encoding="UTF-8"?>
<alunos>
<aluno>
<nome>Fulano</nome>
<sobrenome>de Tal</sobrenome>
<matricula>112233</matricula>
</aluno>
</alunos>
3 / 37
XML - namespaces
´E um m´etodo utilizado para evitar conflitos de nome dos elementos
no XML
Qualifica o elemento
Um nome qualificado (QName) ´e composto pelo namespace + nome
do elemento, no formado {Namespace}:nome
Utiliza-se prefixos para facilitar o uso de namespaces
Por conven¸c˜ao, um namespace ´e declarado no formado de uma URI
4 / 37
XML - namespaces
Exemplo
<?xml version="1.0" encoding="UTF-8"?>
<alunos xmlns="http://upf.br/alunos">
<mstr:aluno xmlns:mstr="http://upf.br/mestrado">
<nome>Fulano</nome>
</mstr:aluno>
<grd:aluno xmlns:gdr="http://upf.br/graduacao">
<nombre>Fulano</nombre>
</grd:aluno>
<doc:aluno xmlns:doc="http://upf.br/doutorado">
<name>Fulano</name>
</doc:aluno>
</alunos>
5 / 37
XML Schema
Define a estrutura de um determinado de uma arquivo XML
Consiste na defini¸c˜ao da hierarquia e dos tipos de dados que podem
ser utilizados nas instˆancias XML
Provˆe um mecanismo para valida¸c˜ao da estrutura de uma instˆancia
XML
Alternativa para o DTD (Document Type Definition)
6 / 37
XML Schema
Exemplo
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:mstr="http://upf.br/mestrado" targetNamespace="http://upf.br/mestrado"
attributeFormDefault="qualified">
<xsd:complexType name="aluno">
<xsd:sequence>
<xsd:element name="nome" minOccurs="1" maxOccurs="1" />
<xsd:element name="sobrenome" minOccurs="0" maxOccurs="1" />
<xsd:element name="matricula" minOccurs="0" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
7 / 37
XPath
Linguagem utilizada para localizar informa¸c˜oes em arquivos XML
Oferece um conjunto de operadores e uma sintaxe formal de consulta
Utiliza-se a hierarquia do schema definido para gerar as consultas
´E utilizada conjuntamente `a linguagem XSLT
Exemplo
/alunos/aluno[0]/nome/text()
/alunos/*:aluno[name = ’Fulano’ and age>10]/id
/alunos/doc:aluno/matricula
/catalogo/album[@artista="Yanni"]
/catalogo/album[@artista="Yanni" and @ano=2014]
8 / 37
XQuery
XQuery ´e o SQL para cole¸c˜oes XML
Utiliza um conjunto espec´ıfico de fun¸c˜oes e utiliza a XPath como um
dos recursos
Acrˆonimo FLOWR (pronuncia-se Flower):
for: Itera sobre uma cole¸c˜ao de dados
let: Declara vari´aveis e atribui a elas valores
where: ´E uma condi¸c˜ao aplicada a sele¸c˜ao da cole¸c˜ao
order by: Ordena a sa´ıda
return: Retorna os valores desejados
9 / 37
XQuery
Exemplo
for $x in doc("gastos.xml")/gastos/rio-grande-sul/passo-fundo
where $x/total>30.000 and $x/ano = 2014
order by $x/total descending
return $x/total
10 / 37
XSLT - EXtensible Stylesheet Language Transformations
Utilizada para transformar documentos XML entre diferentes
estruturas
Utiliza XPath para navegar entre a estrutura do documento de origem
Oferece diversas fun¸c˜oes nativamente
11 / 37
XSLT - EXtensible Stylesheet Language Transformations
Exemplo
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Convidados</h2>
<ul>
<xsl:for-each select="eventos/evento[@nome=’ERBD’]/convidados/convidado">
<li><xsl:value-of select="nome"/></li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
12 / 37
Oracle XML DB
13 / 37
Caracter´ısticas b´asicas
´E um conjunto de tecnologias para banco de dados Oracle, voltadas
a:
Armazenamento de dados XML
Cria¸c˜ao de dados em formato XML
Acesso, busca, valida¸c˜ao, transforma¸c˜ao, convers˜ao e indexa¸c˜ao de
dados XML
Inclu´ıdo como parte do Oracle Database a partir da vers˜ao Oracle9i
Release 2 (9.2)
Provˆe meios para interoperar SQL e XML
14 / 37
XMLType
Tipo de dado SQL nativo criado para armazenar documentos XML
Pode-se utiliz´a-lo como coluna, vari´avel ou argumento em fun¸c˜oes e
procedimentos
Tamb´em ´e poss´ıvel criar uma tabela do tipo XMLType
Apenas estruturas XML bem formadas s˜ao aceitas pelo tipo XMLType
Adicionalmente, os documentos podem ser validados com um XSD
15 / 37
Cria¸c˜ao das tabelas e usu´ario
Exemplo
--Opcional
CREATE USER xmldb_example identified BY xmldb;
GRANT CONNECT,resource TO xmldb_example;
CREATE TABLE xml_documento (
doc_id NUMBER NOT NULL,
descricao varchar2(200) NOT NULL,
documento xmltype NOT NULL,
CONSTRAINT pk_xml_documento PRIMARY KEY(doc_id)
);
CREATE TABLE xml_documento_objeto OF xmltype;
16 / 37
Inser¸c˜ao de dados
Exemplo
insert into xml_documento values (
1, ‘Turma 2013’, XMLTYPE(
’<?xml version="1.0"?>
<crs:cursos xmlns:crs="http://upf.br/cursos">
<cr:curso tipo="mestrado" xmlns:cr="http://upf.br/cursos/curso">
<alunos>
<aluno>
<nome>Fulano</nome>
<matricula>12345</matricula>
</aluno>
<aluno>
<nome>Ciclano</nome>
<matricula>34512</matricula>
</aluno>
</alunos>
</cr:curso>
<cr:curso tipo="doutorado" xmlns:cr="http://upf.br/cursos/curso">
<alunos>
<aluno>
<nome>Fulano 2</nome>
<matricula>doc12345</matricula>
</aluno>
<aluno>
<nome>Ciclano 2</nome>
<matricula>doc34512</matricula>
</aluno>
</alunos>
</cr:curso>
</crs:cursos>’)
); 17 / 37
Inser¸c˜ao de dados
Exemplo
insert into xml_documento_objeto values (XMLTYPE(
’<?xml version="1.0"?>
<crs:cursos xmlns:crs="http://upf.br/cursos">
<cr:curso tipo="mestrado" xmlns:cr="http://upf.br/cursos/curso">
<alunos>
<aluno>
<nome>Fulano</nome>
<matricula>12345</matricula>
</aluno>
<aluno>
<nome>Ciclano</nome>
<matricula>34512</matricula>
</aluno>
</alunos>
</cr:curso>
<cr:curso tipo="doutorado" xmlns:cr="http://upf.br/cursos/curso">
<alunos>
<aluno>
<nome>Fulano 2</nome>
<matricula>doc12345</matricula>
</aluno>
<aluno>
<nome>Ciclano 2</nome>
<matricula>doc34512</matricula>
</aluno>
</alunos>
</cr:curso>
</crs:cursos>’));
18 / 37
Atualiza¸c˜ao de dados
Parˆametros do procedimento updateXML:
xmltype instance: Instˆancia XML
xpath string: Express˜ao XPath que identifica o valor a ser atualizado
value expr: Novo valor
namespace string: Declara¸c˜ao dos namespaces utilizados na XPath
Exemplo
select * from XML_DOCUMENTO_OBJETO;
-- Atualizando primeiro aluno do mestrado
update XML_DOCUMENTO_OBJETO o set o.object_value =
updateXML(o.OBJECT_VALUE,’/cs:cursos/c:curso[@tipo="mestrado"]/alunos/aluno[1]/nome/text()’,
’Aluno atualizado’,’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’);
19 / 37
Atualizando dados
Para inserir novos valores dentro da estrutura do XML pode-se
utilizar os procedimentos:
insertChildXML
insertChildXMLBefore
insertChildXMLAfter
appendChildXML
Dentre os argumentos do procedimento est´a a express˜ao XPath que
indica o ponto exato da inser¸c˜ao
20 / 37
Atualiza¸c˜ao de dados
Parˆametros do procedimento insetChildXML:
xmltype instance : Instˆancia XML
xpath string: Express˜ao XPath que identifica onde inserir o novo valor
child expr: Subexpres˜ao XPath referente ao que ser´a inserido
value expr: Fragmento de XML, do tipo XMLType, que ir´a compor o
que foi definido em child expr
namespace string: Declara¸c˜ao dos namespaces utilizados na XPath
Exemplo
--Inserindo novo aluno de mestrado
update XML_DOCUMENTO_OBJETO o set o.object_value =
insertChildXML(o.OBJECT_VALUE,’/cs:cursos/c:curso[@tipo="mestrado"]/alunos’,’aluno’,XMLType(’
<aluno>
<nome>Novo aluno inserido</nome>
<matricula>mst:12345</matricula>
</aluno>
’),
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’);
21 / 37
Atualiza¸c˜ao de dados
Parˆametros do procedimento insertChildXMLbefore:
xmltype instance : Instˆancia XML
xpath string: Express˜ao XPath que identifica o elemento pai
child expr: Express˜ao XPath - Inserir antes de quem?
value expr: Fragmento de XML, do tipo XMLType, que a ser inserido
namespace string: Declara¸c˜ao dos namespaces utilizados na XPath
Exemplo
--Inserindo novo curso
update XML_DOCUMENTO_OBJETO o set o.object_value = insertChildXMLbefore(o.OBJECT_VALUE,
’/cs:cursos’,--quem eh o pai
’c:curso[@tipo="doutorado"]’,--em relacao a quem?
XMLType(’
<c:curso tipo="graduacao" xmlns:c="http://upf.br/cursos/curso">
<alunos>
<aluno/>
</alunos>
</c:curso>
),-- o que?
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’);
22 / 37
Atualiza¸c˜ao de dados
Parˆametros do procedimento insertChildXMLafter:
xmltype instance : Instˆancia XML
xpath string: Express˜ao XPath que identifica o elemento pai
child expr: Express˜ao XPath - Inserir depois de quem ?
value expr: Fragmento de XML, do tipo XMLType, a ser inserido
namespace string: Declara¸c˜ao dos namespaces utilizados na XPath
Exemplo
update XML_DOCUMENTO_OBJETO o set o.object_value = insertChildXMLafter(o.OBJECT_VALUE,
’/cs:cursos’,
’c:curso[@tipo="doutorado"]’,
XMLType(’
<c:curso tipo="fundamental" xmlns:c="http://upf.br/cursos/curso">
<alunos>
<aluno/>
</alunos>
</c:curso>
’),-- o que?
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’);
23 / 37
Atualiza¸c˜ao de dados
Parˆametros do procedimento appendChildXML:
xmltype instance : Instˆancia XML
xpath string: Express˜ao XPath que onde inserir o novo fragment
value expr: Fragmento de XML, do tipo XMLType, a ser inserido
namespace string: Declara¸c˜ao dos namespaces utilizados na XPath
Exemplo
--Adicionando aluno ao curso
update XML_DOCUMENTO_OBJETO o set o.object_value = appendChildXML(o.OBJECT_VALUE,
’/cs:cursos/c:curso[@tipo="fundamental"]/alunos’,--em relacao a quem?
XMLType(’
<aluno>
<nome>Fulano do fundamental</nome>
<matricula>1111</matricula>
</aluno>
’),-- o que?
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’);
24 / 37
Atualiza¸c˜ao de dados
Parˆametros do procedimento deleteXML:
xmltype instance : Instˆancia XML
xpath string: Express˜ao XPath que onde indica o fragmento a ser
removido
Exemplo
--Eliminando nodo
update XML_DOCUMENTO_OBJETO o set o.object_value = deleteXML(o.OBJECT_VALUE,
’/cs:cursos/c:curso[@tipo="doutorado"]/alunos/aluno[matricula="doc34512"]’,--em relacao a quem?
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’);
25 / 37
Consultas ao conte´udo XML
Parˆametros do m´etodo extract:
xpath string: Express˜ao XPath que define a consulta a ser executada
namespace string: Declara¸c˜ao dos namespaces utilizados na XPath
Tamb´em pode-se utilizar a fun¸c˜ao extract, a qual recebe como um
dos parˆametros uma instˆancia XML
Exemplo
--Recupera o nome do primeiro aluno dos cursos de mestrado
select d.descricao, d.DOCUMENTO.extract(
’/cs:cursos/c:curso[@tipo="mestrado"]/alunos/aluno[1]/nome/text()’,
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’
).getStringVal() as valor from xml_documento d;
26 / 37
Consultas ao conte´udo XML
Exemplo
--Recupera o tipo de curso que possui um aluno com nome = ’Fulano’
select d.descricao, d.DOCUMENTO.extract(
’/cs:cursos/c:curso[alunos/aluno/nome ="Fulano"]/@tipo’,
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’
).getStringVal() as valor from xml_documento d;
--Quantos alunos os cursos de doutorado tem?
select d.descricao, d.DOCUMENTO.extract(
’count(/cs:cursos/c:curso[@tipo="doutorado"]/alunos/aluno)’,
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’
).getStringVal() as valor from xml_documento d;
--Quantos alunos os cursos de doutorado e mestrado juntos possuem?
select d.descricao, d.DOCUMENTO.extract(
’count(/cs:cursos/c:curso[@tipo="doutorado" or @tipo="mestrado"]/alunos/aluno)’,
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’
).getStringVal() as valor from xml_documento d;
--Utilizando a tabela do tipo XMLType
select o.extract(
’/cs:cursos/c:curso[alunos/aluno/nome ="Fulano"]/@tipo’,
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’).getStringVal()
as total from XML_DOCUMENTO_OBJETO o;
27 / 37
Utilizando XSLT
Parˆametros do procedimento XMLSerialize:
DOCUMENT ou CONTENT: Especifica o tipo documento. Se
informado DOCUMENT, o XML informado precisa ser v´alido. Se
informado CONTENT, o conte´udo deve ser um XML v´alido, mas n˜ao
precisa apresentar apenas um elemento raiz
valor: Conte´udo XML no formato textual
Parˆametros do m´etodo transform:
xmltype instance : C´odigo da transforma¸c˜ao do tipo XMLType
28 / 37
Utilizando XSLT
Exemplo
--XMLSerialize cria uma string ou lob com o conteudo. Se informar document, o motor xml valida a estrutura
select XMLSerialize(
DOCUMENT o.transform(XMLType(’<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cr="http://upf.br/cursos/curso"
xmlns:crs="http://upf.br/cursos">
<xsl:template match="/">
<html>
<body>
<table>
<tr>
<th>Nome</th>
<th>Matricula</th>
</tr>
<xsl:apply-templates />
</table>
</body>
</html>
</xsl:template>
29 / 37
Utilizando XSLT (continua¸c˜ao. . . )
Exemplo
<xsl:template match="/crs:cursos/cr:curso[@tipo=’’mestrado’’]">
<xsl:for-each select="alunos/aluno">
<tr>
<td>
<xsl:value-of select="nome"/>
</td>
<td>
<xsl:value-of select="matricula"/>
</td>
</tr>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>’))) as to_html from XML_DOCUMENTO_OBJETO o;
30 / 37
Utilizando XQuery
Parˆametros do procedimento XQuery:
xmltype instance: Express˜ao XQuery v´alida em formato texto.
Qualquer valor inv´alido ´e criticado pelo construtor.
PASSING: Cl´ausula que informa a instˆancia XML a ser submetida `a
XQuery
RETURNING CONTENT: Indica que o resultado deve ser retornado
como uma fragmento XML.
31 / 37
Utilizando XQuery
Exemplo
--Utilizacao de funcoes XMLQuery
SELECT
XMLSerialize( document XMLQuery(
’declare namespace cr=’’http://upf.br/cursos/curso’’;
declare namespace crs=’’http://upf.br/cursos’’;
<html>
<body>
<table>
<tr>
<td>Nome</td>
<td>Matricula</td>
</tr>
{
for $curso in /crs:cursos/cr:curso
where $curso/@tipo eq ’’mestrado’’
return
for $aluno in $curso/alunos/aluno
return <tr>
<td>{$aluno/nome}</td>
<td>{$aluno/matricula}</td> </tr>
}</table>
</body>
</html>
’ PASSING X.DOCUMENTO RETURNING CONTENT) ) AS TO_HTML FROM XML_DOCUMENTO X;
32 / 37
Trabalhando com XML Schema
Parˆametros do procedimento REGISTERSCHEMA, package
DBMS XMLSCHEMA:
schemaurl: Identificador ´unico do schema, no formato de uma URL
schemadoc: XML Schema v´alido, em formato textual
A package DBMS XMLSCHEMA cont´em outros procedimentos
que n˜ao ser˜ao abordados neste momento
33 / 37
Trabalhando com XML Schema
Exemplo
BEGIN
DBMS_XMLSCHEMA.REGISTERSCHEMA(
schemaurl=>’http://upf.br/schemas/alunos.xsd’,
schemadoc=> ’<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:al="http://upf.br/aluno"
targetNamespace="http://upf.br/aluno" elementFormDefault="qualified">
<xsd:element name=’’alunos’’>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="aluno" type="al:TAluno" minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="TAluno">
<xsd:sequence>
<xsd:element name="nome" minOccurs="1" maxOccurs="1"/>
<xsd:element name="matricula" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>’);
END;
34 / 37
Trabalhando com XML Schema (continua¸c˜ao. . . )
Exemplo
CREATE TABLE alunos OF XMLType
XMLTYPE STORE AS CLOB
XMLSCHEMA "http://upf.br/schemas/alunos.xsd"
ELEMENT "alunos";
insert into alunos values(
XMLType(
’<?xml version="1.0"?>
<a:alunos xmlns:a="http://upf.br/aluno"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://upf.br/aluno
http://upf.br/schemas/alunos.xsd">
<a:aluno>
<a:nome>Nome para teste</a:nome>
<a:matricula>23325</a:matricula>
</a:aluno>
<a:aluno>
<a:nome>Nome para teste 2</a:nome>
<a:matricula>233253</a:matricula>
</a:aluno>
</a:alunos>’
)
);
35 / 37
Trabalhando com XML Schema (continua¸c˜ao. . . )
Exemplo
insert into alunos values(
XMLType(
’<?xml version="1.0"?>
<a:alunos xmlns:a="http://upf.br/aluno"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://upf.br/aluno
http://upf.br/schemas/alunos.xsd">
<a:aluno>
<a:nome>Nome para teste</a:nome>
<a:matricula>23325</a:matricula>
</a:aluno>
<a:aluno>
<a:nome>Nome para teste 2</a:nome>
</a:aluno>
</a:alunos>’
)
);
36 / 37
Verifica¸c˜oes
M´etodo isSchemaBased: Retorna 1 se uma determinada instˆancia
XML tem associada uma URI de XML Schema. O valor 0 ´e retornado
quando n˜ao h´a associa¸c˜ao
M´etodo isSchemaValid: Valida a instˆancia de XML contra o seu
XML Schema. O valor 1 indica sucesso e 0 indica falha
M´etodo isSchemaValidated: Indica se a instˆancia XML foi validada
contra um XML Schema ou n˜ao
Exemplo
--indica se o xml eh baseado no XSD
select o.isSchemaBased() from alunos o;
--indica se o xml eh valido
select o.isSchemaValid() from alunos o;
--indica se o schema foi validado
select o.isSchemaValidated() from alunos o;
37 / 37

Oracle XML DB - Conceitos iniciais

  • 1.
    Banco de DadosXML Diego A. Lusa, Mateus H. Dal Forno Universidade de Passo Fundo Programa de P´os Gradua¸c˜ao em Computa¸c˜ao Aplicada - PPGCA 14 de novembro de 2014 1 / 37
  • 2.
  • 3.
    XML - eXtensibleMarkup Language Linguagem criada para descrever dados ´E uma linguagem de marca¸c˜ao que n˜ao apresenta um conjunto de tags pr´e-definidas ´E extens´ıvel e muito utilizada na Web e em arquiteturas SOA Exemplo <?xml version="1.0" encoding="UTF-8"?> <alunos> <aluno> <nome>Fulano</nome> <sobrenome>de Tal</sobrenome> <matricula>112233</matricula> </aluno> </alunos> 3 / 37
  • 4.
    XML - namespaces ´Eum m´etodo utilizado para evitar conflitos de nome dos elementos no XML Qualifica o elemento Um nome qualificado (QName) ´e composto pelo namespace + nome do elemento, no formado {Namespace}:nome Utiliza-se prefixos para facilitar o uso de namespaces Por conven¸c˜ao, um namespace ´e declarado no formado de uma URI 4 / 37
  • 5.
    XML - namespaces Exemplo <?xmlversion="1.0" encoding="UTF-8"?> <alunos xmlns="http://upf.br/alunos"> <mstr:aluno xmlns:mstr="http://upf.br/mestrado"> <nome>Fulano</nome> </mstr:aluno> <grd:aluno xmlns:gdr="http://upf.br/graduacao"> <nombre>Fulano</nombre> </grd:aluno> <doc:aluno xmlns:doc="http://upf.br/doutorado"> <name>Fulano</name> </doc:aluno> </alunos> 5 / 37
  • 6.
    XML Schema Define aestrutura de um determinado de uma arquivo XML Consiste na defini¸c˜ao da hierarquia e dos tipos de dados que podem ser utilizados nas instˆancias XML Provˆe um mecanismo para valida¸c˜ao da estrutura de uma instˆancia XML Alternativa para o DTD (Document Type Definition) 6 / 37
  • 7.
    XML Schema Exemplo <?xml version="1.0"encoding="UTF-8" standalone="no"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:mstr="http://upf.br/mestrado" targetNamespace="http://upf.br/mestrado" attributeFormDefault="qualified"> <xsd:complexType name="aluno"> <xsd:sequence> <xsd:element name="nome" minOccurs="1" maxOccurs="1" /> <xsd:element name="sobrenome" minOccurs="0" maxOccurs="1" /> <xsd:element name="matricula" minOccurs="0" maxOccurs="1" /> </xsd:sequence> </xsd:complexType> </xsd:schema> 7 / 37
  • 8.
    XPath Linguagem utilizada paralocalizar informa¸c˜oes em arquivos XML Oferece um conjunto de operadores e uma sintaxe formal de consulta Utiliza-se a hierarquia do schema definido para gerar as consultas ´E utilizada conjuntamente `a linguagem XSLT Exemplo /alunos/aluno[0]/nome/text() /alunos/*:aluno[name = ’Fulano’ and age>10]/id /alunos/doc:aluno/matricula /catalogo/album[@artista="Yanni"] /catalogo/album[@artista="Yanni" and @ano=2014] 8 / 37
  • 9.
    XQuery XQuery ´e oSQL para cole¸c˜oes XML Utiliza um conjunto espec´ıfico de fun¸c˜oes e utiliza a XPath como um dos recursos Acrˆonimo FLOWR (pronuncia-se Flower): for: Itera sobre uma cole¸c˜ao de dados let: Declara vari´aveis e atribui a elas valores where: ´E uma condi¸c˜ao aplicada a sele¸c˜ao da cole¸c˜ao order by: Ordena a sa´ıda return: Retorna os valores desejados 9 / 37
  • 10.
    XQuery Exemplo for $x indoc("gastos.xml")/gastos/rio-grande-sul/passo-fundo where $x/total>30.000 and $x/ano = 2014 order by $x/total descending return $x/total 10 / 37
  • 11.
    XSLT - EXtensibleStylesheet Language Transformations Utilizada para transformar documentos XML entre diferentes estruturas Utiliza XPath para navegar entre a estrutura do documento de origem Oferece diversas fun¸c˜oes nativamente 11 / 37
  • 12.
    XSLT - EXtensibleStylesheet Language Transformations Exemplo <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Convidados</h2> <ul> <xsl:for-each select="eventos/evento[@nome=’ERBD’]/convidados/convidado"> <li><xsl:value-of select="nome"/></li> </xsl:for-each> </ul> </body> </html> </xsl:template> </xsl:stylesheet> 12 / 37
  • 13.
  • 14.
    Caracter´ısticas b´asicas ´E umconjunto de tecnologias para banco de dados Oracle, voltadas a: Armazenamento de dados XML Cria¸c˜ao de dados em formato XML Acesso, busca, valida¸c˜ao, transforma¸c˜ao, convers˜ao e indexa¸c˜ao de dados XML Inclu´ıdo como parte do Oracle Database a partir da vers˜ao Oracle9i Release 2 (9.2) Provˆe meios para interoperar SQL e XML 14 / 37
  • 15.
    XMLType Tipo de dadoSQL nativo criado para armazenar documentos XML Pode-se utiliz´a-lo como coluna, vari´avel ou argumento em fun¸c˜oes e procedimentos Tamb´em ´e poss´ıvel criar uma tabela do tipo XMLType Apenas estruturas XML bem formadas s˜ao aceitas pelo tipo XMLType Adicionalmente, os documentos podem ser validados com um XSD 15 / 37
  • 16.
    Cria¸c˜ao das tabelase usu´ario Exemplo --Opcional CREATE USER xmldb_example identified BY xmldb; GRANT CONNECT,resource TO xmldb_example; CREATE TABLE xml_documento ( doc_id NUMBER NOT NULL, descricao varchar2(200) NOT NULL, documento xmltype NOT NULL, CONSTRAINT pk_xml_documento PRIMARY KEY(doc_id) ); CREATE TABLE xml_documento_objeto OF xmltype; 16 / 37
  • 17.
    Inser¸c˜ao de dados Exemplo insertinto xml_documento values ( 1, ‘Turma 2013’, XMLTYPE( ’<?xml version="1.0"?> <crs:cursos xmlns:crs="http://upf.br/cursos"> <cr:curso tipo="mestrado" xmlns:cr="http://upf.br/cursos/curso"> <alunos> <aluno> <nome>Fulano</nome> <matricula>12345</matricula> </aluno> <aluno> <nome>Ciclano</nome> <matricula>34512</matricula> </aluno> </alunos> </cr:curso> <cr:curso tipo="doutorado" xmlns:cr="http://upf.br/cursos/curso"> <alunos> <aluno> <nome>Fulano 2</nome> <matricula>doc12345</matricula> </aluno> <aluno> <nome>Ciclano 2</nome> <matricula>doc34512</matricula> </aluno> </alunos> </cr:curso> </crs:cursos>’) ); 17 / 37
  • 18.
    Inser¸c˜ao de dados Exemplo insertinto xml_documento_objeto values (XMLTYPE( ’<?xml version="1.0"?> <crs:cursos xmlns:crs="http://upf.br/cursos"> <cr:curso tipo="mestrado" xmlns:cr="http://upf.br/cursos/curso"> <alunos> <aluno> <nome>Fulano</nome> <matricula>12345</matricula> </aluno> <aluno> <nome>Ciclano</nome> <matricula>34512</matricula> </aluno> </alunos> </cr:curso> <cr:curso tipo="doutorado" xmlns:cr="http://upf.br/cursos/curso"> <alunos> <aluno> <nome>Fulano 2</nome> <matricula>doc12345</matricula> </aluno> <aluno> <nome>Ciclano 2</nome> <matricula>doc34512</matricula> </aluno> </alunos> </cr:curso> </crs:cursos>’)); 18 / 37
  • 19.
    Atualiza¸c˜ao de dados Parˆametrosdo procedimento updateXML: xmltype instance: Instˆancia XML xpath string: Express˜ao XPath que identifica o valor a ser atualizado value expr: Novo valor namespace string: Declara¸c˜ao dos namespaces utilizados na XPath Exemplo select * from XML_DOCUMENTO_OBJETO; -- Atualizando primeiro aluno do mestrado update XML_DOCUMENTO_OBJETO o set o.object_value = updateXML(o.OBJECT_VALUE,’/cs:cursos/c:curso[@tipo="mestrado"]/alunos/aluno[1]/nome/text()’, ’Aluno atualizado’,’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’); 19 / 37
  • 20.
    Atualizando dados Para inserirnovos valores dentro da estrutura do XML pode-se utilizar os procedimentos: insertChildXML insertChildXMLBefore insertChildXMLAfter appendChildXML Dentre os argumentos do procedimento est´a a express˜ao XPath que indica o ponto exato da inser¸c˜ao 20 / 37
  • 21.
    Atualiza¸c˜ao de dados Parˆametrosdo procedimento insetChildXML: xmltype instance : Instˆancia XML xpath string: Express˜ao XPath que identifica onde inserir o novo valor child expr: Subexpres˜ao XPath referente ao que ser´a inserido value expr: Fragmento de XML, do tipo XMLType, que ir´a compor o que foi definido em child expr namespace string: Declara¸c˜ao dos namespaces utilizados na XPath Exemplo --Inserindo novo aluno de mestrado update XML_DOCUMENTO_OBJETO o set o.object_value = insertChildXML(o.OBJECT_VALUE,’/cs:cursos/c:curso[@tipo="mestrado"]/alunos’,’aluno’,XMLType(’ <aluno> <nome>Novo aluno inserido</nome> <matricula>mst:12345</matricula> </aluno> ’), ’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’); 21 / 37
  • 22.
    Atualiza¸c˜ao de dados Parˆametrosdo procedimento insertChildXMLbefore: xmltype instance : Instˆancia XML xpath string: Express˜ao XPath que identifica o elemento pai child expr: Express˜ao XPath - Inserir antes de quem? value expr: Fragmento de XML, do tipo XMLType, que a ser inserido namespace string: Declara¸c˜ao dos namespaces utilizados na XPath Exemplo --Inserindo novo curso update XML_DOCUMENTO_OBJETO o set o.object_value = insertChildXMLbefore(o.OBJECT_VALUE, ’/cs:cursos’,--quem eh o pai ’c:curso[@tipo="doutorado"]’,--em relacao a quem? XMLType(’ <c:curso tipo="graduacao" xmlns:c="http://upf.br/cursos/curso"> <alunos> <aluno/> </alunos> </c:curso> ),-- o que? ’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’); 22 / 37
  • 23.
    Atualiza¸c˜ao de dados Parˆametrosdo procedimento insertChildXMLafter: xmltype instance : Instˆancia XML xpath string: Express˜ao XPath que identifica o elemento pai child expr: Express˜ao XPath - Inserir depois de quem ? value expr: Fragmento de XML, do tipo XMLType, a ser inserido namespace string: Declara¸c˜ao dos namespaces utilizados na XPath Exemplo update XML_DOCUMENTO_OBJETO o set o.object_value = insertChildXMLafter(o.OBJECT_VALUE, ’/cs:cursos’, ’c:curso[@tipo="doutorado"]’, XMLType(’ <c:curso tipo="fundamental" xmlns:c="http://upf.br/cursos/curso"> <alunos> <aluno/> </alunos> </c:curso> ’),-- o que? ’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’); 23 / 37
  • 24.
    Atualiza¸c˜ao de dados Parˆametrosdo procedimento appendChildXML: xmltype instance : Instˆancia XML xpath string: Express˜ao XPath que onde inserir o novo fragment value expr: Fragmento de XML, do tipo XMLType, a ser inserido namespace string: Declara¸c˜ao dos namespaces utilizados na XPath Exemplo --Adicionando aluno ao curso update XML_DOCUMENTO_OBJETO o set o.object_value = appendChildXML(o.OBJECT_VALUE, ’/cs:cursos/c:curso[@tipo="fundamental"]/alunos’,--em relacao a quem? XMLType(’ <aluno> <nome>Fulano do fundamental</nome> <matricula>1111</matricula> </aluno> ’),-- o que? ’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’); 24 / 37
  • 25.
    Atualiza¸c˜ao de dados Parˆametrosdo procedimento deleteXML: xmltype instance : Instˆancia XML xpath string: Express˜ao XPath que onde indica o fragmento a ser removido Exemplo --Eliminando nodo update XML_DOCUMENTO_OBJETO o set o.object_value = deleteXML(o.OBJECT_VALUE, ’/cs:cursos/c:curso[@tipo="doutorado"]/alunos/aluno[matricula="doc34512"]’,--em relacao a quem? ’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’); 25 / 37
  • 26.
    Consultas ao conte´udoXML Parˆametros do m´etodo extract: xpath string: Express˜ao XPath que define a consulta a ser executada namespace string: Declara¸c˜ao dos namespaces utilizados na XPath Tamb´em pode-se utilizar a fun¸c˜ao extract, a qual recebe como um dos parˆametros uma instˆancia XML Exemplo --Recupera o nome do primeiro aluno dos cursos de mestrado select d.descricao, d.DOCUMENTO.extract( ’/cs:cursos/c:curso[@tipo="mestrado"]/alunos/aluno[1]/nome/text()’, ’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’ ).getStringVal() as valor from xml_documento d; 26 / 37
  • 27.
    Consultas ao conte´udoXML Exemplo --Recupera o tipo de curso que possui um aluno com nome = ’Fulano’ select d.descricao, d.DOCUMENTO.extract( ’/cs:cursos/c:curso[alunos/aluno/nome ="Fulano"]/@tipo’, ’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’ ).getStringVal() as valor from xml_documento d; --Quantos alunos os cursos de doutorado tem? select d.descricao, d.DOCUMENTO.extract( ’count(/cs:cursos/c:curso[@tipo="doutorado"]/alunos/aluno)’, ’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’ ).getStringVal() as valor from xml_documento d; --Quantos alunos os cursos de doutorado e mestrado juntos possuem? select d.descricao, d.DOCUMENTO.extract( ’count(/cs:cursos/c:curso[@tipo="doutorado" or @tipo="mestrado"]/alunos/aluno)’, ’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’ ).getStringVal() as valor from xml_documento d; --Utilizando a tabela do tipo XMLType select o.extract( ’/cs:cursos/c:curso[alunos/aluno/nome ="Fulano"]/@tipo’, ’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’).getStringVal() as total from XML_DOCUMENTO_OBJETO o; 27 / 37
  • 28.
    Utilizando XSLT Parˆametros doprocedimento XMLSerialize: DOCUMENT ou CONTENT: Especifica o tipo documento. Se informado DOCUMENT, o XML informado precisa ser v´alido. Se informado CONTENT, o conte´udo deve ser um XML v´alido, mas n˜ao precisa apresentar apenas um elemento raiz valor: Conte´udo XML no formato textual Parˆametros do m´etodo transform: xmltype instance : C´odigo da transforma¸c˜ao do tipo XMLType 28 / 37
  • 29.
    Utilizando XSLT Exemplo --XMLSerialize criauma string ou lob com o conteudo. Se informar document, o motor xml valida a estrutura select XMLSerialize( DOCUMENT o.transform(XMLType(’<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cr="http://upf.br/cursos/curso" xmlns:crs="http://upf.br/cursos"> <xsl:template match="/"> <html> <body> <table> <tr> <th>Nome</th> <th>Matricula</th> </tr> <xsl:apply-templates /> </table> </body> </html> </xsl:template> 29 / 37
  • 30.
    Utilizando XSLT (continua¸c˜ao.. . ) Exemplo <xsl:template match="/crs:cursos/cr:curso[@tipo=’’mestrado’’]"> <xsl:for-each select="alunos/aluno"> <tr> <td> <xsl:value-of select="nome"/> </td> <td> <xsl:value-of select="matricula"/> </td> </tr> </xsl:for-each> </xsl:template> <xsl:template match="text()"/> </xsl:stylesheet>’))) as to_html from XML_DOCUMENTO_OBJETO o; 30 / 37
  • 31.
    Utilizando XQuery Parˆametros doprocedimento XQuery: xmltype instance: Express˜ao XQuery v´alida em formato texto. Qualquer valor inv´alido ´e criticado pelo construtor. PASSING: Cl´ausula que informa a instˆancia XML a ser submetida `a XQuery RETURNING CONTENT: Indica que o resultado deve ser retornado como uma fragmento XML. 31 / 37
  • 32.
    Utilizando XQuery Exemplo --Utilizacao defuncoes XMLQuery SELECT XMLSerialize( document XMLQuery( ’declare namespace cr=’’http://upf.br/cursos/curso’’; declare namespace crs=’’http://upf.br/cursos’’; <html> <body> <table> <tr> <td>Nome</td> <td>Matricula</td> </tr> { for $curso in /crs:cursos/cr:curso where $curso/@tipo eq ’’mestrado’’ return for $aluno in $curso/alunos/aluno return <tr> <td>{$aluno/nome}</td> <td>{$aluno/matricula}</td> </tr> }</table> </body> </html> ’ PASSING X.DOCUMENTO RETURNING CONTENT) ) AS TO_HTML FROM XML_DOCUMENTO X; 32 / 37
  • 33.
    Trabalhando com XMLSchema Parˆametros do procedimento REGISTERSCHEMA, package DBMS XMLSCHEMA: schemaurl: Identificador ´unico do schema, no formato de uma URL schemadoc: XML Schema v´alido, em formato textual A package DBMS XMLSCHEMA cont´em outros procedimentos que n˜ao ser˜ao abordados neste momento 33 / 37
  • 34.
    Trabalhando com XMLSchema Exemplo BEGIN DBMS_XMLSCHEMA.REGISTERSCHEMA( schemaurl=>’http://upf.br/schemas/alunos.xsd’, schemadoc=> ’<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:al="http://upf.br/aluno" targetNamespace="http://upf.br/aluno" elementFormDefault="qualified"> <xsd:element name=’’alunos’’> <xsd:complexType> <xsd:sequence> <xsd:element name="aluno" type="al:TAluno" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="TAluno"> <xsd:sequence> <xsd:element name="nome" minOccurs="1" maxOccurs="1"/> <xsd:element name="matricula" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:schema>’); END; 34 / 37
  • 35.
    Trabalhando com XMLSchema (continua¸c˜ao. . . ) Exemplo CREATE TABLE alunos OF XMLType XMLTYPE STORE AS CLOB XMLSCHEMA "http://upf.br/schemas/alunos.xsd" ELEMENT "alunos"; insert into alunos values( XMLType( ’<?xml version="1.0"?> <a:alunos xmlns:a="http://upf.br/aluno" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://upf.br/aluno http://upf.br/schemas/alunos.xsd"> <a:aluno> <a:nome>Nome para teste</a:nome> <a:matricula>23325</a:matricula> </a:aluno> <a:aluno> <a:nome>Nome para teste 2</a:nome> <a:matricula>233253</a:matricula> </a:aluno> </a:alunos>’ ) ); 35 / 37
  • 36.
    Trabalhando com XMLSchema (continua¸c˜ao. . . ) Exemplo insert into alunos values( XMLType( ’<?xml version="1.0"?> <a:alunos xmlns:a="http://upf.br/aluno" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://upf.br/aluno http://upf.br/schemas/alunos.xsd"> <a:aluno> <a:nome>Nome para teste</a:nome> <a:matricula>23325</a:matricula> </a:aluno> <a:aluno> <a:nome>Nome para teste 2</a:nome> </a:aluno> </a:alunos>’ ) ); 36 / 37
  • 37.
    Verifica¸c˜oes M´etodo isSchemaBased: Retorna1 se uma determinada instˆancia XML tem associada uma URI de XML Schema. O valor 0 ´e retornado quando n˜ao h´a associa¸c˜ao M´etodo isSchemaValid: Valida a instˆancia de XML contra o seu XML Schema. O valor 1 indica sucesso e 0 indica falha M´etodo isSchemaValidated: Indica se a instˆancia XML foi validada contra um XML Schema ou n˜ao Exemplo --indica se o xml eh baseado no XSD select o.isSchemaBased() from alunos o; --indica se o xml eh valido select o.isSchemaValid() from alunos o; --indica se o schema foi validado select o.isSchemaValidated() from alunos o; 37 / 37