EXERCÍCIO XML, DTD, XPATH e XQUERY
Considere o fragmento do documento XML a seguir, que apresenta indicadores do programa federal Luz para Todos. O referido documento também está acessível pelo Portal Brasileiro de Dados Abertos, através do link http://goo.gl/hmqhB .
...
<metadado>
<grupo_informacao> <id>13</id>
<nome>Luz Para Todos</nome>
<periodicidade>Anual</periodicidade> <base_territorial>Estadual</base_territorial> <demais_series_grupo> <serie_historica href="http://i3gov. planejamento.gov.br/xml/serie/53.xml"/> <serie_historica href="http://i3gov. planejamento.gov.br/xml/serie/54.xml"/> </demais_series_grupo> </grupo_informacao> <id>60</id>
<nome>Pessoas atendidas pelo programa Luz Para Todos</nome> <descricao>Pessoas atendidas pelo programa
Luz Para Todos</descricao>
<produto>Pessoas Beneficiadas</produto> <multiplicador/> <tipo_numerico>Inteiro</tipo_numerico> <unidade_medida>Pessoa</unidade_medida> <fonte_gestora>MME</fonte_gestora> <fonte_provedora>MME</fonte_provedora>
<aditividade>Os dados podem ser consolidados
por base territorial e/ou periodicidade</aditividade> </metadado> <dados> <dado> <ano>2004</ano> <codibge>11</codibge> <valor>430</valor> </dado> <dado> <ano>2004</ano> <codibge>12</codibge> <valor>2765</valor> </dado> <dado> ...
O arquivo XML divide os dados em dois conjuntos:
- Metadado: contém informações sobre os dados no arquivo - Dados: contém os dados sobre cada região.
1. Escreva u m a c o n s u l t a X P a t h q u e a p r e s e n t e o n o m e d o p r o g r a m a ( “ L u z p a r a T o d o s ” ) e a d e s c r i ç ã o d o s d a d o s a p r e s e n t a d o s n o r e f e r i d o a r q u i v o ( t a g d e s c r i c a o ) .
//metadado/grupo_informacao/nome | data//metadado/descrição
RESULTADO:
<nome>Luz Para Todos</nome>
<descricao>Pessoas atendidas pelo programa Luz Para Todos</descricao>
2. Escreva u m a c o n s u l t a X P a t h q u e a p r e s e n t e o s d a d o s ( r e g i ã o / p e s s o a s a t e n d i d a s ) d o p r o g r a m a , r e f e r e n t e s a o a n o 2 0 0 4 . //serie_historica/dados/dado[ano = 2004]/codibge | //serie_historica/dados/dado[ano = 2004]/valor RESULTADO: <codibge>11</codibge> <valor>430</valor> <codibge>12</codibge> <valor>2765</valor> ... 3. Escreva u m a c o n s u l t a X P a t h q u e a p r e s e n t e o s d a d o s d o ú l t i m o r e g i s t r o d a s é r i e ( u s a n d o a f u n ç ã o l a s t ( ) c o m o p r e d i c a d o ) . //serie_historica/dados/dado[last()] RESULTADO: <dado> <ano>2010</ano> <codibge>52</codibge> <valor>6760</valor> </dado> 4. Escreva u m a c o n s u l t a X P a t h q u e a p r e s e n t e a r e g i ã o d e t o d o s o s r e g i s t r o s d o a n o d e 2 0 1 0 e m q u e f o r a m a t e n d i d a s m a i s d e 2 4 6 0 0 0 p e s s o a s .
//serie_historica/dados/dado[valor > 246000 and ano = 2010]/codibge
RESULTADO:
<codibge>21</codibge> <codibge>29</codibge>
5. Escreva u m a c o n s u l t a X P a t h q u e a p r e s e n t e o s d a d o s d e a t e n d i m e n t o d o e s t a d o d e S a n t a C a t a r i n a ( c o d i b g e = 4 2 ) . //serie_historica/dados/dado[codibge = 42] RESULTADO: <dado> <ano>2004</ano> <codibge>42</codibge> <valor>5000</valor> </dado> ...
6. Utilizando expressão FLWOR, escreva u m a c o n s u l t a X Q u e r y q u e a p r e s e n t e o s d a d o s d o e s t a d o d e S a n t a C a t a r i n a n o p r o g r a m a , r e f e r e n t e s a o a n o 2 0 0 9 . A p r e s e n t e o r e s u l t a d o c o m o u m a l i s t a H T M L ( < l i > E s t a d o : ? ? – A n o : ? ? ? ? - V a l o r : ? ? ? < / l i > ) .
for $x in doc("LuzParaTodos-60.xml")//serie_historica/dados/dado where $x/codibge = 42 and
$x/ano = 2009 return
<li>Estado: {data($x/codibge)} - Ano: {data($x/ano)} – Valor: {data($x/valor)}</li>
RESULTADO:
<li>Estado: 42 - Ano: 2009 – Valor: 9955</li>
7. Utilizando expressões FLWOR, escreva D U A S c o n s u l t a s X Q u e r y q u e g e r e m u m r e l a t ó r i o e m X M L , o r d e n a d o p o r E s t a d o / A n o , c o n f o r m e a e s t r u t u r a a s e g u i r : Programa/Descrição Estado/Ano/Pessoas atingidas a) Cabeçalho for $x in doc("LuzParaTodos-60.xml") //data/serie_historica/metadado return <cabecalho> <programa>{data($x/grupo_informacao/nome)}</programa> <descricao>{data($x/descricao)}</descricao> </cabecalho> b) Corpo for $x in doc("LuzParaTodos-60.xml") //data/serie_historica/dados/dado order by $x/codibge, $x/ano
return <dado>
<estado>{data($x/codibge)}</estado> <ano>{data($x/ano)}</ano>
RESULTADO: a) Cabeçalho <cabecalho>
<programa>Luz Para Todos</programa>
<descricao>Pessoas atendidas pelo programa Luz Para Todos</descricao> </cabecalho> b) Corpo <dado> <estado>11</estado> <ano>2004</ano> <pessoas>430</pessoas> </dado> ... <luz> { for $x in //metadado return <cabecalho> <programa>{data($x/grupo_informacao/nome)}</programa> {$x/descricao} </cabecalho> } <dados> { for $y in //dado
order by $y/codibge, $y/ano return <dado> <estado>{data($y/codibge)}</estado> <ano>{data($y/ano)}</ano> <pessoas>{data($y/valor)}</pessoas> </dado> }</dados> </luz>
8. Utilizando expressões FLWOR, escreva u m a c o n s u l t a X Q u e r y q u e a p r e s e n t e o n o m e d e t o d o s o s E s t a d o s e m q u e , n o a n o d e 2 0 1 0 , f o r a m a t e n d i d a s m a i s d e 2 4 6 0 0 0 p e s s o a s .
// Solução 01-
for $x in doc("LuzParaTodos-60.xml")
//data/serie_historica/dados/dado where $x/ano = 2010 and
$x/valor > 246000 return
if ($x/codibge = 42) then
<estado>Santa Catarina</estado> else if ($x/codibge = 12) then <estado>Acre</estado>
else if ($x/codibge = 27) then <estado>Alagoas</estado> else if ($x/codibge = 29) then <estado>Bahia</estado>
else if ($x/codibge = 21) then <estado>Maranhão</estado> else <estado>{data($x/codibge)}</estado> ... RESULTADO: <estado>Maranhão</estado> <estado>Bahia</estado>
// Solução alternativa let $estados := <estados> <estado codibge="12">Acre</estado> <estado codibge="27">Alagoas</estado> <estado codibge="16">Amapa</estado> <estado codibge="13">Amazonas</estado> <estado codibge="29">Bahia</estado> <estado codibge="23">Ceara</estado>
<estado codibge="53">Distrito Federal</estado> <estado codibge="32">Espirito Santo</estado> <estado codibge="52">Goias</estado>
<estado codibge="21">Maranhao</estado> <estado codibge="51">Mato Grosso</estado>
<estado codibge="50">Mato Grosso do Sul</estado> <estado codibge="31">Minas Gerais</estado>
<estado codibge="15">Para</estado> <estado codibge="25">Paraiba</estado> <estado codibge="41">Parana</estado> <estado codibge="26">Pernambuco</estado> <estado codibge="22">Piaui</estado>
<estado codibge="33">Rio de Janeiro</estado>
<estado codibge="24">Rio Grande do Norte</estado> <estado codibge="43">Rio Grande do Sul</estado> <estado codibge="11">Rondonia</estado>
<estado codibge="14">Roraima</estado>
<estado codibge="42">Santa Catarina</estado> <estado codibge="35">Sao Paulo</estado>
<estado codibge="28">Sergipe</estado> <estado codibge="17">Tocantins</estado> </estados>
for $x in //dados/dado
where $x/ano = 2010 and $x/valor > 246000 return <estado codibge="{data($x/codibge)}"> <nome_estado> {data($estados//estado[@codibge = $x/codibge])} </nome_estado> </estado>
9. Escreva u m a D T D p a r a v a l i d a r o s u b c o n j u n t o d e D A D O S d o a r q u i v o X M L c r i a d o n a q u e s t ã o 7 , a c i m a .
<!ELEMENT programa (cabecalho, dados)> <!ELEMENT cabeçalho (programa, descricao)> <!ELEMENT programa #PCDATA>
<!ELEMENT descricao #PCDATA>
<!ELEMENT dados (estado, ano, pessoas)> <!ELEMENT estado #PCDATA>
<!ELEMENT ano #PCDATA> <!ELEMENT pessoas #PCDATA>