Ler XML com Oracle á partir de uma URL

Escrito por Pedroneto, em Oracle - 11/02/2012

1

Depois de muito pesquisar na internet com o Thiago Henrique (que trabalha comigo na Micromap), conseguimos criar uma SQL no Oracle para ler um XML à partir de uma URL, sem precisar estar armazenado no servidor.

Com esta função, não precisa necessariamente ser XML o arquivo, a SQL poderá ler qualquer retorno, podendo ser texto por exemplo.

Vamos utilizar como exemplo um XML simples, segue o conteúdo:

teste.xml
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <cliente>
  3.    <nome>PEDRO NETO</nome>
  4.    <idade>21 anos</idade>
  5.    <cidade>santa cruz do rio pardo</cidade>
  6.    <empresas>
  7.       <empresa>
  8.          <nome>Micromap</nome>
  9.          <cidade>Santa Cruz do Rio Pardo</cidade>
  10.       </empresa>
  11.       <empresa>
  12.          <nome>Vietra</nome>
  13.          <cidade>Florianópolis</cidade>
  14.       </empresa>
  15.       <empresa>
  16.          <nome>Google</nome>
  17.          <cidade>Mountain View</cidade>
  18.       </empresa>
  19.    </empresas>
  20. </cliente>

 

vamos começar pelo mais simples.
Para retornar o XML inteiro, seja para gravar em uma tabela, ou para ler com uma programação server-side (PHP, Java, ASP), utilize a seguinte select:

  1. SELECT
  2.    HTTPURIType('http://www.site.com.br/teste.xml').getCLOB() retorno
  3. FROM dual

no exemplo acima, o campo “retorno”, vai retornar o XML completo da página como um texto, que no nosso caso seria:

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?><cliente><nome>PEDRO NETO</nome> …

caso você colocasse o endereço www.google.com.br retornaria o código fonte html do google…

Explicação da SQL:

HTTPURIType: esta função le o endereço colocado, e o transforma em um HTTP URI TYPE, à partir daí, ele disponibilizará diversas funções, como podendo ver o tipo de documento, pegar o conteúdo do arquivo, etc…

getCLOB: esta função retornará o conteúdo (HTML, XML) do endereço setado…

FROM dual: é usado quando não tem necessidade de extrair os dados de uma tabela específica, mais informações

Pegando um nó/tag do XML

mantendo o XML usado no exemplo acima, vamos pegar o conteúdo do nó “nome”, para retornar o nome do cliente.
Logo depois, neste mesmo post, estarei explicando uma forma melhor de estar retornando o valor de um nó do XML, mas para fins de aprendizado, segue abaixo um outro exemplo:

  1. SELECT
  2.       EXTRACTVALUE(
  3.              sys.xmltype.createXML(
  4.                       HTTPURIType( 'http://www.site.com.br/teste.xml' ).getClob()
  5.              )
  6.              , '/cliente/nome'
  7.       ) nomeCliente
  8. FROM dual

na sql acima, o campo “nomeCliente” retornaria: PEDRO NETO

Explicação da SQL:

EXTRACTVALUE: esta função, irá extractar o nó selecionado no segundo parâmetro. No primeiro parâmetro é colocado o conteúdo XML.

Pegando vários nós (loop) do XML

Como disse acima, há uma forma melhor de pegar os valores do XML, mas novamente, para fins de aprendizado, segue abaixo um exemplo menos prático.

A função EXTRACTVALUE, que usamos no último exemplo, extrai o valor de apenas um nó simples (filho), caso a solicitação seja em um nó pai (como o nó “empresas”, por exemplo), dará erro, então usaremos o EXTRACT, como o seguinte exemplo:

  1. SELECT
  2.      EXTRACT(
  3.         sys.xmltype.createXML(
  4.                   HTTPURIType( 'http://www.site.com.br/teste.xml' ).getClob()
  5.         ), '/cliente/nome') nomeCliente
  6. FROM dual

Melhor Solução

Agora explicarei um exemplo muito mais prático, que descobri enquanto escrevia este post.
Iremos tratar um XML, como se fosse uma tabela do oracle. Não criaremos tabelas, não criaremos tabelas temporárias, nem nada, mas no exemplo a seguir, a sql tratará o XML como se fosse realmente uma tabela, só que sem ela existir.
Segue abaixo:

  1. SELECT
  2.       EXTRACTVALUE(column_value, '/empresa/nome') empresa,
  3.       EXTRACTVALUE(column_value, '/empresa/cidade') cidade
  4. FROM
  5.    TABLE(
  6.        XMLSequence(
  7.              sys.xmltype.createXML(
  8.                      HTTPURITYPE( 'http://micromap.com.br/portalcidadao/teste.xml' ).getClob()
  9.              ).extract('/cliente/empresas/empresa')
  10.        )
  11.   ) t

nesse caso, ele retornaria várias linhas com o nome de cada empresa e o nome da cidade.

Empresa Cidade
Micromap Santa Cruz do Rio Pardo
Vietra Florianópolis
Google Mountain View

Explicação da SQL:

XMLSequence: Toma como entrada uma instância XMLType e retorna um array dos nós de nível superior na XMLType.

TABLE: Trata o XML como se fosse uma tabela do oracle

Problemas com acentos – Atualização 16/02/2012

O Yuri Menom (trabalha comigo na Micromap), levantou uma questão importante: Acentos.

O Banco aqui da empresa está com a codificação UTF-16, e um xml geralmente é UTF-8. Utilizaremos então a função CONVERT do ORACLE (função que serve para converter a codificação da string).

Mas ao usar somente o CONVERT para utf16, repare que ficam caracteres vazios entre cada letra. Esses caracteres são nulos (não são espaços, são nulos), então teremos que usar o REPLACE também. Segue o código utilizando os exemplos anteriores:

  1. SELECT
  2.       EXTRACTVALUE(column_value, '/empresa/nome') empresa,
  3.       REPLACE(
  4.              CONVERT(
  5.                      EXTRACTVALUE(column_value, '/empresa/cidade')
  6.                      ,'AL16UTF16'
  7.                      ,'UTF8'
  8.               ),
  9.               CHR(0)
  10.               ,''
  11.        ) cidade
  12. FROM
  13.    TABLE(
  14.        XMLSequence(
  15.              sys.xmltype.createXML(
  16.                      HTTPURITYPE( 'http://micromap.com.br/portalcidadao/teste.xml' ).getClob()
  17.              ).extract('/cliente/empresas/empresa')
  18.        )
  19.   ) t

Repare que tivemos que usar o CHR(0) no REPLACE, pois, é um caracter nulo que queremos retirar, e não o caracter espaço (que seria CHR(32) )

Explicação da SQL:

CONVERT: ( string, codificação destino, codificação origem ) – Função usada para converter a codificação da string.

REPLACE: ( string, string à ser pesquisada, string substituida ) – Função para substituir uma string/caracter por outra.

CHR: ( número do caracter da tabela ASCII) – Função que retorna o caracter relacionado ao número da tabela ASCII que coloca em seu parâmetro.

Enfim,
espero ter ajudado,
qualquer dúvida ou sugestão, comentem…

Folder de Natal – Portfólio

Escrito por Pedroneto, em Portfólio - 12/12/2011

0

Este é um folder de divulgação dos novos produtos da Micromap, feito em Corel Draw X5.

A idéia principal foi mostrar os bons preços de alguns produtos e outros manter a idéia de censurado para as pessoas virem até a loja conferir.

Segue o a frente e verso do folder, respectivamente:

Folder de Natal - Frente

Folder de Natal - Frente

 

Folder de Natal - Verso

Folder de Natal - Verso

Para que serve Interface em PHP

Escrito por Pedroneto, em PHP - 06/12/2011

0

O Interface é usado para criar padrões de comportamento e funcionamento para nossas classes, principalmente quando queremos deixar a aplicação utilizável em vários bancos de dados (poliformismo).

Com o Interface, criamos um padrão de como as classes devem ser feitas, assim temos a certeza que a classe terá os métodos necessários para a utilização da aplicação.

Na Prática

Vamos usar como exemplo, um sistema basico, com adicionar, listar, editar, e deletar: Continue Lendo »

Como ter o novo Perfil do Facebook antes que todos

Escrito por Pedroneto, em Facebook - 25/10/2011

2

Neste post irei explicar como ter o novo perfil do Facebook…

A Primeira vista achei meio bagunçado, mas ter um topo no perfil achei muito legal… as pessoas vão poder usar e abusar da criatividade.

Segue abaixo um print de como ficou meu perfil, e aproveitem e vejam como será o novo perfil do Facebook (clique para ver maior):

Facebook Personalizado

Enfim, vamos lá…

Por enquanto, esta versão do Facebook está liberada apenas para desenvolvedores, então vamos explicar como tornar um perante ao Facebook então…é simples, fácil, e rápido, leva menos de 3 minutos…não precisa receber código por email, celular, nem nada…tudo é atualizado em tempo real

1º Passo

Na barra de pesquisa no topo, procure por Facebook Developers, e acesse o primeiro perfil que aparecer.

2º Passo

No topo (onde fica “Página inicial”, “Perfil”), clique no link “Aplicações”, ou “Application” caso o seu facebook esteja em inglês.

Facebook Aplicações

 

3º Passo

Permita o acesso do Facebook Developers à sua conta:

Permissão Facebook

 

4º Passo

Clique em “Criar novo Aplicativo”…

Aparecerá uma janela pedindo o nome e o namespace do programa, coloque qualquer coisa, como seu nome por exemplo…

O “app display name” não aparece em lugar nenhum, o namespace aparece no URL (e precisa aparecer “Valid”, “Available” do lado do campo)

Novo Aplicativo

Clique em “Concordo com a Política de Privacidade da Plataforma” (I agree to the Facebook Platform Policies.), e em seguida “Continuar“. Conclua os passos habituais de verificação de segurança…

6º Passo

Quando surgir na sua tela sua aplicação, clique em “Gráficos Abertos” (ou “Open Graph“) e preencha os campos obrigatórios em inglês, o da esquerda com um verbo e o da direita com um nome. Por exemplo: “People can make a bacon“. Clique em “Começar”.

7º Passo

Em seguida aparecerá uma tela solicitando diversos dados, ignore-a e clique em “Save Changes and Next“:

save-app

8º Passo

Clique agora em “Save and Finish” e pronto, está feito… Volte em seu perfil e no topo terá a mensagem: “Introdução ao seu Perfil Novo”… Personalize-o e Publique-o.

Infelizmente por enquanto somente algumas pessoas podem ver seu perfil novo, mas em novembro será liberado à todos, e seu perfil já estará todo estilizado antes de qualquer outro…

Qualquer dúvida comentem…

Programação utilizada no Portal da Globo, o G1

Escrito por Pedroneto, em Sem categoria - 24/10/2011

1

Nesta segunda-feira (24/10), por volta das 12:50, estava navegando no G1 para saber as notícias, e me deparei com um erro de execução, mostrando assim qual a programação utilizada no G1, uma dúvida de milhares de pessoas…

A Programação utilizada é o Ruby, com o framework Rails (Ruby on Rails), e a utilização do MongoDB…

clique no print screen abaixo para ver a tela completa de erros (eu salvei no computador a página):

Erro g1

Estatísticas de programação mais usada na web

Escrito por Pedroneto, em PHP - 22/09/2011

1

Galera,
o Java é a programação mais usada no mundo, mas quem manda na Web é o PHP.

Langpop.com

Tiobe

Nestes links acima, mostram que o Java é o mais usado no mundo. Convenhamos, há java para celular, para TV, para rádio, para computador, e para web, acredito que a área mais fraca do Java seja na Web.
E nem precisa falar né, a maior aplicação web do mundo, é em PHP, valendo “alguns muitos bilhões de dólares”.

Enfim, há muito tempo já vi este artigo no iMasters mas estou repassando pra galera que não viu. São executados testes em 12 milhões de domínios, e 59% é PHP, que equivale a quase 4milhões. O Java fica com 0%, contendo apenas um pouco mais de 16mil domínios.

Clique na imagem abaixo para ler o artigo completo:
Linguagens de Programação mais usadas

Na verdade o texto do iMasters é uma tradução deste artigo:
http://phpadvent.org/2010/usage-statistics-by-ilia-alshanetsky

Logo posto meu próximo post, será sobre um plugin do jQuery de fazer gráficos, aguardem…

CSS Hacks nunca mais

Escrito por Pedroneto, em CSS - 09/09/2011

0

Eu sei que essa não é uma técnica nova nem nada, e não lembro em qual dos blogs da vida já vi isso, mas vi novamente esta técnica sendo usada no template principal do wordpress, e resolvi repassar a ideia à quem não sabe.

Há um método de exibir certos elementos nos IEs com comentários html, por exemplo:

  1. <!–[if IE]>
  2. Este texto só aparece no Internet Explorer<br />
  3. <![endif]–>
  4. <!–[if IE 7]>
  5. Este texto aparece apenas no Internet Explorer 7<br />
  6. <![endif]–>
  7. <!–[if gte IE 5]>
  8. Este texto aparece apenas nas versões iguais ou superiores ao Internet Explorer 5<br />
  9. <![endif]–>
  10. <!–[if lt IE 6]>
  11. Este texto aparece apenas nas versões inferiores ao Internet Explorer 6<br />
  12. <![endif]–>
  13. <!–[if lte IE 5]>
  14. Este texto aparece apenas nas versões inferiores ou iguais ao Internet Explorer 5<br />
  15. <![endif]–>

para mais informações: http://www.quirksmode.org/css/condcom.html (em Inglês)

enfim, sendo assim, você tem duas opções para acabar com os hacks de CSS. Aí vai:

1ª opção:

Você pode inserir o seguinte texto no lugar da sua tag HTML:

  1. <!–[if IE 6]>
  2. <html id="ie6" xmlns="http://www.w3.org/1999/xhtml" lang="pt-br">
  3. <![endif]–>
  4. <!–[if IE 7]>
  5. <html id="ie7" xmlns="http://www.w3.org/1999/xhtml" lang="pt-br">
  6. <![endif]–>
  7. <!–[if IE 8]>
  8. <html id="ie8" xmlns="http://www.w3.org/1999/xhtml" lang="pt-br">
  9. <![endif]–>
  10. <!–[if !(IE 6) | !(IE 7) | !(IE 8)  ]><!–>
  11. <html xmlns="http://www.w3.org/1999/xhtml" lang="pt-br">
  12. <!–<![endif]–>

Neste código, inserimos no HTML um id com a versão do IE, sendo assim, em seu CSS, basta colocar:

  1. .texto { /* em todos os navegadores */
  2.      color:#000;
  3. }
  4. #ie6 .texto { /* apenas no IE6 */
  5.      color: #ff0000;
  6. }
  7. #ie7 .texto { /* apenas no IE7 */
  8.      color:#0000ff;
  9. }

Simples, prático, sem hacks em seu CSS…

2ª Opção:

Eu não gosto muito dessa opção, por ter que deixar um CSS separado do outro, ou seja, outra requisição HTTP, e caso tenha que dar manutenção, serão 2 arquivos que deverão ser abertos, mas aí vai para quem se interessar:

Você deve separar em vários arquivos CSS, de acordo com cada versão, por exemplo, os “hacks” que deveriam ser do IE7, você faz um arquivo: style-ie7.css, e no código HTML, logo abaixo do CSS original, deve colocar:

  1. <!–[if IE 7]>
  2. <link href="style-ie7.css" rel="stylesheet" type="text/css" />
  3. <![endif]–>

Utilizando sempre o comentário de acordo com cada versão que deseja.

Bom, fica aí a dica então.

Qualquer dúvida/sugestão, comentem…

Definnition – Portfólio

Escrito por Pedroneto, em Portfólio - 09/09/2011

0

Mais um site de meu portfólio, fiz no final do ano passado em parceria com a Vietra.
Neste site fiz a parte da administração e a programação do site. Trabalhei também com a integração de alguns dados com o Fórum IPB, pegando as notícias ,a “Programação” (onde lista os próximos eventos), e os usuários que estão online.

Foi feito em PHP com jQuery, utilizando Mysql como banco de dados, e integrando o site com o IPB.

Confiram: www.definnition.com.br

Definnition

Definnition - Página Principal

Desafiando Gigantes – Vídeo – Portfólio

Escrito por Pedroneto, em Portfólio - 07/09/2011

0

Uma vez me interessei em aprender Adobe Premiere para editar vídeos, e comecei a buscar alguns tutoriais, quando surgiu a oportunidade de estar fazendo algumas edições básicas em um vídeo para a Special Dog apresentar em uma Conferência de Vendas. Segue o vídeo:

 

Um menu rollover diferente com jQuery + CSS

Escrito por Pedroneto, em CSS, Javascript, jQuery - 02/09/2011

1

DemonstraçãoDownload

Há algum tempo, eu pensava em um menu rollover diferente dos que eu tinha visto, procurei em vários sites, e não achei nada.

Resolvi então fazer um do zero mesmo, parece bem simples depois de pronto, mas deu um certo trabalhinho na lógica, e setar o que cada um devia fazer, essas coisas…Vamos chamar ele então de pnMenu.

Após finalizado, incluí também no site da Micromap (foi pra ele mesmo que fiz)…

Segue uma uma demonstração de como funciona!

Primeiramente, vamos incluir o jQuery, e o jquery.pnMenu.js (que pode ser baixado aqui)
Continue Lendo »