xplode_me Posted June 3, 2005 at 11:30 AM Report #199 Posted June 3, 2005 at 11:30 AM Alguém percebe de XML que me dê uma ajudinha aqui? O caso é o seguinte: Tenho uma base de dados de músicas com acordes para guitarra em XML. O ficheiro é unico e segue um padrão: Tag numero + nome da música tag musica tag acordes tag letra repetindo-se sempre. O que eu queria fazer era em PHP chamar atraves de um ficheiro por ex: musicas.php uma musica em especifico, contendo esta os respectivos numero, nome, musica acordes e letra.. Qualquer coisa no estilo: musicas.php?musica=001 puxaria a musica 1 da base de dados e mostrava essa musica! 😛 Alguém pa dar uma ajudinha? Eu do PHP dou bem conta o problema ta no XML.... Cumps!
Dabubble Posted July 9, 2005 at 10:17 AM Report #1811 Posted July 9, 2005 at 10:17 AM Tenho uma base de dados de músicas com acordes para guitarra em XML. Aquilo que pretendes se bem que nao e impossivel e complicado pois primeiro tens de usar as funcoes de tratamento de ficheiros de php e depois tens de adicionar um modulo para tratamento de XML etens de usar as respectivas funcoes. A outra alternativa e fazeres o teu proprio parser de XML que ainda e mais complicado. Nao seria mais facil montar uma BD em MySQL ou outro motor de BD qualquer e depois usar as funcoes de BD de php (que rula nesse aspecto)? Mesmo que ja tenhas uma bd feita XML podes fazer um programita que meta os dados na BD. Se esta nao for a solução para ti diz kk koisa. Cumps
AndreLC Posted August 8, 2011 at 12:04 AM Report #406714 Posted August 8, 2011 at 12:04 AM Boas, Como devo proceder para exportar dados de um XML para uma Base de Dados em MySQL e ler em PHP? Alguém poderia dar umas luzes? Obrigado. Cumps. echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";
laboss Posted August 8, 2011 at 12:25 AM Report #406718 Posted August 8, 2011 at 12:25 AM Montas a estrutura da bd idêntica a estrutura dos xml's e depois com o http://www.php.net/manual/en/function.simplexml-load-file.php lês o xml e montas o insert, se não conseguir mete aqui um excerto do teu xml que tentamos ajudar-t 🙂 podes sempre tentar com insert into TABELA(xml) values load_file('CAMINHO/PARA/O/FICHEIRO.xml')
AndreLC Posted August 8, 2011 at 12:41 AM Report #406723 Posted August 8, 2011 at 12:41 AM Desde já obrigado por responderes.. o XML tem a seguinte estrutura e conteúdo: <?xml version="1.0" encoding="WINDOWS-1252" standalone="true"?> <artigos> <referencia>1009</referencia> <descricao>GESSO ACABAMENTO ALBI-PLAS FINO BRANCO</descricao> <unidade>SC</unidade> <volume>PAL</volume> <linha_produto>GESSOS</linha_produto> <tipo_produto>GESSOS ACABAMENTO</tipo_produto> <volumes>48.00</volumes> <peso_liquido>25.000</peso_liquido> <ficha_tecnica>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\DH836.PDF</ficha_tecnica> <ficha_tecnica2>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\LISTA_DOC_HOMOLOGACAO_LNEC_20090903.PDF</ficha_tecnica2> <ce>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\DOC20100412180348AP.PDF</ce> <imagem>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\FOTOS\TGO_ALNOP.JPG</imagem> <folheto_comercial>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\FOLHETOCOMERCIALPROYALBI-PLUS-ALBIPLASFINO.PDF</folheto_comercial> <observacoes>Gesso destinado a ser aplicado manualmente mediante talocha metálica, indicado para o acabamento tipo polido em camada pelicular sobre gessos de regularização, projectados anteriormente em parâmetros horizontais e verticais em interiores. Para a sua correcta aderência deverá ser aplicado antes da presa final da camada de regularização.</observacoes> <icon1/> <icon2/> <icon3/> <icon4/> <icon5/> <categoria1>Interiores</categoria1> <categoria2>Revestimento Interior de Paredes e Tectos</categoria2> <categoria3>Revest. de Alv. b.t.bc</categoria3> <categoria4>Gessos de Acabamento</categoria4> <categoria5/> </artigos> Depois construi a Base de Dados em MySQL com os nomes dos campos igual ao nome das etiquetas: CREATE TABLE IF NOT EXISTS `artigos` ( `referencia` int(11) NOT NULL, `descricao` varchar(255) NOT NULL, `unidade` varchar(255) NOT NULL, `volume` varchar(255) NOT NULL, `linha_produto` varchar(255) NOT NULL, `tipo_produto` varchar(255) NOT NULL, `volumes` varchar(255) NOT NULL, `peso_liquido` varchar(255) NOT NULL, `ficha_tecnica` varchar(255) NOT NULL, `ficha_tecnica2` varchar(255) NOT NULL, `ce` varchar(255) NOT NULL, `imagem` varchar(255) NOT NULL, `folheto_comercial` varchar(255) NOT NULL, `observacoes` varchar(255) NOT NULL, `icon1` varchar(255) NOT NULL, `icon2` varchar(255) NOT NULL, `icon3` varchar(255) NOT NULL, `icon4` varchar(255) NOT NULL, `icon5` varchar(255) NOT NULL, `categoria1` varchar(255) NOT NULL, `categoria2` varchar(255) NOT NULL, `categoria3` varchar(255) NOT NULL, `categoria4` varchar(255) NOT NULL, `categoria5` varchar(255) NOT NULL, PRIMARY KEY (`referencia`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; Mas agora como exporto os dados que estão nas etiquetas do XML para a Base de Dados em MySQL que implementei? Desde já o meu obrigado. Cumprimentos. echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";
laboss Posted August 8, 2011 at 01:06 AM Report #406729 Posted August 8, 2011 at 01:06 AM Primeiro atenção aos campos que colocaste na tabela tudo varchar e uma ma pratica tenta arranjar os campos adequados a cada campo 🙂 fiz uma coisa assim pó rápido nem sei se trabalhar mas deve trabalhar PHP <?php mysql_connect('localhost', 'mysql_user', 'mysql_password'); mysql_select_db('db1'); if (file_exists ( 'teste.xml' )) { $xml = simplexml_load_file ( 'teste.xml' ); echo "<pre>"; foreach ( $xml->artigos as $Dados ) { mysql_query("INSERT INTO artigos (referencia, descricao, unidade, volume, linha_produto, tipo_produto, volumes,peso_liquido,ficha_tecnica,ficha_tecnica2,ce,imagem,folheto_comercial,observacoes,icon1,icon2,icon3,icon4,icon5,categoria1,categoria2,categoria3,categoria4,categoria5) VALUES ('{$Dados->referencia}','{$Dados->descricao}','{$Dados->unidade}','{$Dados->volume}','{$Dados->linha_produto}','{$Dados->tipo_produto}','{$Dados->volumes}','{$Dados->peso_liquido}','{$Dados->ficha_tecnica}','{$Dados->ficha_tecnica2}','{$Dados->ce}','{$Dados->imagem}','{$Dados->folheto_comercial}','{$Dados->observacoes}','{$Dados->icon1}','{$Dados->icon2}','{$Dados->icon3}','{$Dados->icon4}','{$Dados->categoria1}','{$Dados->categoria2}','{$Dados->categoria3}','{$Dados->categoria4}','{$Dados->categoria5}');"); } mysql_close(); } else { exit ( 'Failed to open test.xml.' ); } ?> E o teu XML com vários registos <?xml version="1.0" encoding="WINDOWS-1252"?> <artigoSet> <artigos> <referencia>1009</referencia> <descricao>GESSO ACABAMENTO ALBI-PLAS FINO BRANCO</descricao> <unidade>SC</unidade> <volume>PAL</volume> <linha_produto>GESSOS</linha_produto> <tipo_produto>GESSOS ACABAMENTO</tipo_produto> <volumes>48.00</volumes> <peso_liquido>25.000</peso_liquido> <ficha_tecnica>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\DH836.PDF</ficha_tecnica> <ficha_tecnica2>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\LISTA_DOC_HOMOLOGACAO_LNEC_20090903.PDF</ficha_tecnica2> <ce>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\DOC20100412180348AP.PDF</ce> <imagem>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\FOTOS\TGO_ALNOP.JPG</imagem> <folheto_comercial>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\FOLHETOCOMERCIALPROYALBI-PLUS-ALBIPLASFINO.PDF</folheto_comercial> <observacoes>Gesso destinado a ser aplicado manualmente mediante talocha metálica, indicado para o acabamento tipo polido em camada pelicular sobre gessos de regularização, projectados anteriormente em parâmetros horizontais e verticais em interiores. Para a sua correcta aderência deverá ser aplicado antes da presa final da camada de regularização.</observacoes> <icon1/> <icon2/> <icon3/> <icon4/> <icon5/> <categoria1>Interiores</categoria1> <categoria2>Revestimento Interior de Paredes e Tectos</categoria2> <categoria3>Revest. de Alv. b.t.bc</categoria3> <categoria4>Gessos de Acabamento</categoria4> <categoria5/> </artigos> <artigos> <referencia>1010</referencia> <descricao>GESSO ACABAMENTO ALBI-PLAS FINO BRANCO</descricao> <unidade>SC</unidade> <volume>PAL</volume> <linha_produto>GESSOS</linha_produto> <tipo_produto>GESSOS ACABAMENTO</tipo_produto> <volumes>48.00</volumes> <peso_liquido>25.000</peso_liquido> <ficha_tecnica>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\DH836.PDF</ficha_tecnica> <ficha_tecnica2>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\LISTA_DOC_HOMOLOGACAO_LNEC_20090903.PDF</ficha_tecnica2> <ce>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\DOC20100412180348AP.PDF</ce> <imagem>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\FOTOS\TGO_ALNOP.JPG</imagem> <folheto_comercial>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\FOLHETOCOMERCIALPROYALBI-PLUS-ALBIPLASFINO.PDF</folheto_comercial> <observacoes>Gesso destinado a ser aplicado manualmente mediante talocha metálica, indicado para o acabamento tipo polido em camada pelicular sobre gessos de regularização, projectados anteriormente em parâmetros horizontais e verticais em interiores. Para a sua correcta aderência deverá ser aplicado antes da presa final da camada de regularização.</observacoes> <icon1/> <icon2/> <icon3/> <icon4/> <icon5/> <categoria1>Interiores</categoria1> <categoria2>Revestimento Interior de Paredes e Tectos</categoria2> <categoria3>Revest. de Alv. b.t.bc</categoria3> <categoria4>Gessos de Acabamento</categoria4> <categoria5/> </artigos> </artigoSet> Se não tiveres 1 XML, mas tiveres varios ou seja 1 para cada registo podes usar a função com glob algo assim <?php mysql_connect ( 'localhost', 'mysql_user', 'mysql_password' ); mysql_select_db ( 'db1' ); foreach ( glob ( "*.xml" ) as $filename ) { if (file_exists ($filename)) { $Dados = simplexml_load_string ( file_get_contents ( $filename ) ); mysql_query ( "INSERT INTO artigos (referencia, descricao, unidade, volume, linha_produto, tipo_produto, volumes,peso_liquido,ficha_tecnica,ficha_tecnica2,ce,imagem,folheto_comercial,observacoes,icon1,icon2,icon3,icon4,icon5,categoria1,categoria2,categoria3,categoria4,categoria5) VALUES ('{$Dados->referencia}','{$Dados->descricao}','{$Dados->unidade}','{$Dados->volume}','{$Dados->linha_produto}','{$Dados->tipo_produto}','{$Dados->volumes}','{$Dados->peso_liquido}','{$Dados->ficha_tecnica}','{$Dados->ficha_tecnica2}','{$Dados->ce}','{$Dados->imagem}','{$Dados->folheto_comercial}','{$Dados->observacoes}','{$Dados->icon1}','{$Dados->icon2}','{$Dados->icon3}','{$Dados->icon4}','{$Dados->categoria1}','{$Dados->categoria2}','{$Dados->categoria3}','{$Dados->categoria4}','{$Dados->categoria5}');" ); echo ( 'Enviado para BD '. $filename ); mysql_close (); } else { echo ( 'Failed to open '. $filename ); } } ?>
AndreLC Posted August 8, 2011 at 01:20 AM Report #406731 Posted August 8, 2011 at 01:20 AM Pois os tipos de dados ainda irei acertar, mas isso é num instante 🙂 Percebi a lógica, amanhã irei estudar melhor a tua solução e apresentarei resultados. Obrigado pela dica da função glob, pois desconhecia e é realmente uma mais-valia 🙂 Obrigado laboss. Cumps. echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";
AndreLC Posted August 8, 2011 at 08:52 AM Report #406744 Posted August 8, 2011 at 08:52 AM Bom dia laboss, Há qualquer coisa que não está certo, pois não está a inserir os dados na Base de Dados... Em ambas as situações (com a função glob ou não) vai parar ao else, executando o exit do foreach, apresentando o 'Failed to open test.xml'. Fiz um ficheiro à parte com a ligação para ter a certeza que estava correcta. E alterei o tipo da Base de Dados que estava em MyISAM para InnoDB, mas penso que não irá fazer diferença... Segundo o que vi, o problema deve estar no foreach. Alguma ajuda? Obrigado. Cumps. echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";
laboss Posted August 8, 2011 at 10:22 AM Report #406761 Posted August 8, 2011 at 10:22 AM o ficheiro teste.xml esta no mesmo directório do ficheiro php que estas a correr? se tiveres a usar o foreach faz isto depois disto foreach ( glob ( "*.xml" ) as $filename ) { mete echo $filename;
AndreLC Posted August 8, 2011 at 10:36 AM Report #406769 Posted August 8, 2011 at 10:36 AM Sim o ficheiro está no mesmo directório. Fiz o echo do $filename e não aparece nada, a página está em branco :S echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";
laboss Posted August 8, 2011 at 10:40 AM Report #406772 Posted August 8, 2011 at 10:40 AM tenta foreach ( glob ( "*" ) as $filename ) { echo $filename;
AndreLC Posted August 8, 2011 at 10:43 AM Report #406776 Posted August 8, 2011 at 10:43 AM O que aparece: O Internet Explorer não consegue mostrar a página Web! echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";
laboss Posted August 8, 2011 at 11:16 AM Report #406786 Posted August 8, 2011 at 11:16 AM isso e problema do teu codigo ou do teu server aqui funcionou o glob <?php foreach ( glob ( "*" ) as $filename ) { echo $filename; } ?>
AndreLC Posted August 8, 2011 at 11:27 AM Report #406790 Posted August 8, 2011 at 11:27 AM Desculpa @laboss, erro meu. Só assim funciona sim... Mas agora como coloco a parte do INSERT no foreach a funcionar? echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";
laboss Posted August 8, 2011 at 11:28 AM Report #406792 Posted August 8, 2011 at 11:28 AM Mostra o output disso sff <?php mysql_connect ( 'localhost', 'root', '' ); mysql_select_db ( 'teste' ); foreach ( glob ( "*.xml" ) as $filename ) { $Dados = simplexml_load_string ( file_get_contents ( $filename ) ); $resultado = mysql_query ( "INSERT INTO artigos (referencia, descricao, unidade, volume, linha_produto, tipo_produto, volumes,peso_liquido,ficha_tecnica,ficha_tecnica2,ce,imagem,folheto_comercial,observacoes,icon1,icon2,icon3,icon4,icon5,categoria1,categoria2,categoria3,categoria4,categoria5) VALUES ('{$Dados->referencia}','{$Dados->descricao}','{$Dados->unidade}','{$Dados->volume}','{$Dados->linha_produto}','{$Dados->tipo_produto}','{$Dados->volumes}','{$Dados->peso_liquido}','{$Dados->ficha_tecnica}','{$Dados->ficha_tecnica2}','{$Dados->ce}','{$Dados->imagem}','{$Dados->folheto_comercial}','{$Dados->observacoes}','{$Dados->icon1}','{$Dados->icon2}','{$Dados->icon3}','{$Dados->icon4}','{$Dados->categoria1}','{$Dados->categoria2}','{$Dados->categoria3}','{$Dados->categoria4}','{$Dados->categoria5}');" ); if (! $resultado) { echo "Erro no ficheiro <b>" . $filename . "</b> ". mysql_error () . "<br>"; } else { echo ('Enviado para BD ' . $filename); } } mysql_close (); ?> O meu output Erro no ficheiro sitemap.xml Table 'teste.artigos' doesn't exist Erro no ficheiro teste - Cópia - Cópia.xml Table 'teste.artigos' doesn't exist Erro no ficheiro teste - Cópia.xml Table 'teste.artigos' doesn't exist Erro no ficheiro teste.xml Table 'teste.artigos' doesn't exist
AndreLC Posted August 8, 2011 at 11:38 AM Report #406797 Posted August 8, 2011 at 11:38 AM Aparece os ficheiros que tenho na pasta: 7226_MultiflexXML_28072011.XML ligacao.php exporta_xml.php estava a tentar colocar só a extensão .XML, mas não aparece nada... echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";
laboss Posted August 8, 2011 at 11:41 AM Report #406800 Posted August 8, 2011 at 11:41 AM tens o extensão em maiúscula <?php mysql_connect ( 'localhost', 'root', '' ); mysql_select_db ( 'teste' ); foreach ( glob ("{*.xml,*.XML}", GLOB_BRACE) as $filename ) { $Dados = simplexml_load_string ( file_get_contents ( $filename ) ); $resultado = mysql_query ( "INSERT INTO artigos (referencia, descricao, unidade, volume, linha_produto, tipo_produto, volumes,peso_liquido,ficha_tecnica,ficha_tecnica2,ce,imagem,folheto_comercial,observacoes,icon1,icon2,icon3,icon4,icon5,categoria1,categoria2,categoria3,categoria4,categoria5) VALUES ('{$Dados->referencia}','{$Dados->descricao}','{$Dados->unidade}','{$Dados->volume}','{$Dados->linha_produto}','{$Dados->tipo_produto}','{$Dados->volumes}','{$Dados->peso_liquido}','{$Dados->ficha_tecnica}','{$Dados->ficha_tecnica2}','{$Dados->ce}','{$Dados->imagem}','{$Dados->folheto_comercial}','{$Dados->observacoes}','{$Dados->icon1}','{$Dados->icon2}','{$Dados->icon3}','{$Dados->icon4}','{$Dados->categoria1}','{$Dados->categoria2}','{$Dados->categoria3}','{$Dados->categoria4}','{$Dados->categoria5}');" ); if (! $resultado) { echo "Erro no ficheiro <b>" . $filename . "</b> ". mysql_error () . "<br>"; } else { echo ('Enviado para BD ' . $filename); } } mysql_close (); ?> O meu output Erro no ficheiro sitemap.xml Table 'teste.artigos' doesn't exist Erro no ficheiro teste - Cópia - Cópia.xml Table 'teste.artigos' doesn't exist Erro no ficheiro teste - Cópia.xml Table 'teste.artigos' doesn't exist Erro no ficheiro teste.xml Table 'teste.artigos' doesn't exist
AndreLC Posted August 8, 2011 at 11:46 AM Report #406803 Posted August 8, 2011 at 11:46 AM Não percebo o que estou a fazer de errado. O output que me aparece é o mesmo O Internet Explorer não consegue mostrar a página Web :dontgetit: echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";
laboss Posted August 8, 2011 at 11:56 AM Report #406806 Posted August 8, 2011 at 11:56 AM Qual e o tamanho do XML? Tenta abrir com o chorme ou o firefox, normalmente esse erro da quando o servidor não recebe a requisição do cliente, quando é ficheiros grandes regra geral da timeout, mas tenta com o firefox a ver se da. se der timeout tenta meter isto depois da tag php set_time_limit (10000000); ini_set("max_execution_time",155); ja agora comenta a mysql_query e troca por echo
AndreLC Posted August 8, 2011 at 12:06 PM Report #406808 Posted August 8, 2011 at 12:06 PM São 70kb, penso que não seja por aí... No ff também já tinha testado: A ligação para o servidor foi reposta enquanto a página estava a ser carregada. Já no safari, por exemplo: O Safari não consegue abrir a página. Portanto, aparentemente não parece ser do browser... echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now