Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jfreiren

Ler e reescrever XML com 3 níveis

Recommended Posts

Olá pessoal, sou nova aqui no fórum e esto precisando muito da ajuda de vocês. É o seguinte. Tenho o seguinte XML em que preciso ler reescrever o item <preco> no seguinte formato(9999,99).

<?xml version="1.0" encoding="utf-8"?>
<estoque>
	<veiculo>
		<id>998877</id>
		<placa>6050</placa>
		<marca id="14">AUDI</marca>
		<modelo id="72"> A5 </modelo>
		<versao id="434"> 2.0 16V Turbo Active </versao>
		<anofabricacao>2013</anofabricacao>
		<anomodelo>2014</anomodelo>
		<cambio id="1">Automático</cambio>
		<km>28160</km>
		<portas>4</portas>
		<cor id="11">Prata</cor>
		<combustivel id="5">Flex</combustivel>
		<preco>R$ 92.900,00</preco>
		<observacao> Veículo em excelente estado de conservação.</observacao>
		<complementos>
			<complemento id="5">IPVA Pago</complemento>
			<complemento id="6">Licenciado</complemento>
			<complemento id="10">Manual do proprietário</complemento>
		</complementos>
		<opcionais>
			<opcional id="54">Air bag</opcional>
			<opcional id="4">Alarme</opcional>
			<opcional id="6">Ar condicionado</opcional>
			<opcional id="8">Ar quente</opcional>
			<opcional id="12">Bancos de couro</opcional>
			<opcional id="15">Computador de bordo</opcional>
			<opcional id="18">Desembaçador traseiro</opcional>
			<opcional id="19">Direção elétrica</opcional>
			<opcional id="23">Freios ABS</opcional>
			<opcional id="29">Retrovisores elétricos</opcional>
			<opcional id="30">Rodas de liga leve</opcional>
			<opcional id="36">Travas elétricas</opcional>
			<opcional id="38">Vidros elétricos</opcional>
			<opcional id="39">Vidros verdes</opcional>
			<opcional id="1">Air bag do motorista</opcional>
			<opcional id="2">Air bag do passageiro</opcional>
			<opcional id="42">Alarme anti-furto</opcional>
			<opcional id="43">Alarme velocidade</opcional>
			<opcional id="62">Aviso sonoro de faróis acesos</opcional>
			<opcional id="9">Banco com regulagem elétrica</opcional>
			<opcional id="10">Banco do motorista com ajuste de altura</opcional>
			<opcional id="11">Banco traseiro bipartido</opcional>
			<opcional id="13">Bancos dianteiros com aquecimento</opcional>
			<opcional id="14">Check control</opcional>
			<opcional id="44">Coluna de direção com regulagem de altura</opcional>
			<opcional id="16">Controle automático de velocidade</opcional>
			<opcional id="17">Controle de tração</opcional>
			<opcional id="21">Encosto de cabeça traseiro</opcional>
			<opcional id="22">Faróis de milha</opcional>
			<opcional id="45">Freio a disco nas 4 rodas</opcional>
			<opcional id="41">Freios ABS c/ EBD</opcional>
			<opcional id="25">Piloto automático</opcional>
			<opcional id="48">Pintura metálica</opcional>
			<opcional id="26">Porta-copos</opcional>
			<opcional id="27">Relógio digital</opcional>
			<opcional id="55">Retrovisor com pisca</opcional>
			<opcional id="28">Retrovisor fotocrômico</opcional>
			<opcional id="64">Retrovisores na cor do veículo</opcional>
			<opcional id="31">Sensor de chuva</opcional>
			<opcional id="32">Sensor de estacionamento</opcional>
			<opcional id="53">Temporizador do limpador do para-brisa</opcional>
			<opcional id="40">Volante com regulagem de altura</opcional>
			<opcional id="57">Volante em couro</opcional>
		</opcionais>
		<acessorios>
			<acessorio id="30">Alto falantes dianteiros</acessorio>
			<acessorio id="31">Alto falantes traseiros</acessorio>
			<acessorio id="42">Brake light</acessorio>
			<acessorio id="65">Chave cópia</acessorio>
			<acessorio id="18">Farol xenônio</acessorio>
			<acessorio id="32">Antena no teto</acessorio>
			<acessorio id="71">Luz de cortesia no teto</acessorio>
		</acessorios>
		<fotos>
			<foto>fotos/6050_01.jpg</foto>
			<foto>fotos/6050_02.jpg</foto>
			<foto>fotos/6050_03.jpg</foto>
		</fotos>
	</veiculo>
	<veiculo>
		<id>778899</id>
		<placa>9262</placa>
		<marca id="39">FIAT</marca>
		<modelo id="332"> PALIO </modelo>
		<versao id="2369"> 1.6 MPI Sporting 16V </versao>
		<tipomotor/>
		<anofabricacao>2013</anofabricacao>
		<anomodelo>2014</anomodelo>
		<cambio id="3">Manual</cambio>
		<km>33000</km>
		<portas>4</portas>
		<cor id="4">Branco</cor>
		<combustivel id="5">Flex</combustivel>
		<preco>R$ 35.900,00</preco>
		<observacao> Veículo revisado, pneus em excelente estado.</observacao>
		<complementos>
		    <complemento id="5">IPVA Pago</complemento>
		    <complemento id="6">Licenciado</complemento>
		    <complemento id="10">Manual do proprietário</complemento>
		</complementos>
		<opcionais>
		    <opcional id="54">Air bag</opcional>
		    <opcional id="4">Alarme</opcional>
		    <opcional id="7">Ar condicionado digital</opcional>
		    <opcional id="12">Bancos de couro</opcional>
		    <opcional id="20">Direção hidráulica</opcional>
		    <opcional id="23">Freios ABS</opcional>
		    <opcional id="24">Limpador traseiro</opcional>
		    <opcional id="29">Retrovisores elétricos</opcional>
     		    <opcional id="30">Rodas de liga leve</opcional>
	     	    <opcional id="36">Travas elétricas</opcional>
		    <opcional id="37">Trio elétrico</opcional>
     		    <opcional id="38">Vidros elétricos</opcional>
	     	    <opcional id="39">Vidros verdes</opcional>
     		    <opcional id="44">Coluna de direção com regulagem de altura</opcional>
	     	    <opcional id="45">Freio a disco nas 4 rodas</opcional>
     		    <opcional id="41">Freios ABS c/ EBD</opcional>
	     	    <opcional id="26">Porta-copos</opcional>
     		    <opcional id="27">Relógio digital</opcional>
		</opcionais>
		<acessorios>
	     	   <acessorio id="37">Banco traseiro rebatível</acessorio>
     		   <acessorio id="38">Bancos dianteiros reclináveis</acessorio>
     		   <acessorio id="39">Bancos revestidos em tecido</acessorio>
		</acessorios>
		<fotos>
		     <foto>fotos/9262_01.jpg</foto>
		     <foto>fotos/9262_02.jpg</foto>
		     <foto>fotos/9262_03.jpg</foto>
		     <foto>fotos/9262_04.jpg</foto>
		     <foto>fotos/9262_05.jpg</foto>
		</fotos>
	</veiculo>
</estoque>

Acontece o seguinte, estou conseguindo ler os itens de primeiro nível e reescrever o valor <preco> no formato que desejo. O problema está na leitura dos itens que estão dentro dos nós <complementos>,<acessorios>, <opcionais> e <fotos>.

Estou usando o seuinte codigo:

<?php
// Faz o load do arquivo XML e retorna um objeto
$arquivo_xml = simplexml_load_file('modelo-xml.xml');

// Loop para ler o objeto
for ( $j = 0; $j < count( $arquivo_xml ); $j++ ) {
	// Imprime o valor o valor da tag <id>
	echo $arquivo_xml->veiculo[$j]->id . '<br>';
	
	// Imprime o valor o valor da tag <placa>
	echo $arquivo_xml->veiculo[$j]->placa . '<br>';
	
	// Imprime o valor o valor da <marca>
	echo $arquivo_xml->veiculo[$j]->marca . '<br>';
	
	// Imprime o valor o valor da <modelo>
	echo $arquivo_xml->veiculo[$j]->modelo . '<br>';
	
	// Imprime o valor o valor da <versao>
	echo $arquivo_xml->veiculo[$j]->versao . '<br>';

	// Imprime o valor o valor da <anomodelo>
	echo $arquivo_xml->veiculo[$j]->anomodelo . '<br>';
	
	// Imprime o valor o valor da <image></image>
	echo $arquivo_xml->veiculo[$j]->cambio . '<br>';

	// Imprime o valor o valor da <km>
	echo $arquivo_xml->veiculo[$j]->km . '<br>';

	// Imprime o valor o valor da <potar>
	echo $arquivo_xml->veiculo[$j]->portas . '<br>';

	// Imprime o valor o valor da <cor>
	echo $arquivo_xml->veiculo[$j]->cor . '<br>';

	// Imprime o valor o valor da <combustivel>
	echo $arquivo_xml->veiculo[$j]->combustivel . '<br>';
	
	// Imprime o valor o valor da <preco>
	echo str_replace(".","",substr( $arquivo_xml->veiculo[$j]->preco , 3)). '<br>';

	// Imprime o valor o valor da description <image></image>
	echo $arquivo_xml->veiculo[$j]->observacao . '<br>';	

	foreach($arquivo_xml->veiculo as $key => $item)
	{
         echo $item->complementos->complemento.'</br>';
    }

	// Apenas uma quebra de linha a mais
	echo '<hr>';
}
?>

O resultado que me trás é este:

998877
6050
AUDI
A%
2.0 16V Turbo Active
2014
Automático
28160
4
Prata
Flex
92900,00
Veículo em excelente estado de conservação.
IPVA Pago
IPVA Pago

778899
9262
FIAT
PALIO
1.6 MPI Sporting 16V
2014
Manual
33000
4
Branco
Flex
35900,00
Veículo revisado, pneus em excelente estado.
IPVA Pago
IPVA Pago

Como faço para que os itens dentro dos atributos complementos, acessorios, opcionais e fotos sejam lidos? e possa reescrever um XML com estes valores?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use a biblioteca DOM tanto para ler quanto para reescrever.

Exemplo:

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book>
      <author>Jack Herrington</author>
      <title>PHP Hacks</title>
      <publisher>O'Reilly</publisher>
   </book>
   <book>
      <author>Jack Herrington</author>
      <title>Podcasting Hacks</title>
      <publisher>O'Reilly</publisher>
   </book>
</books>

read.php

<?php
$doc = new DOMDocument();
$doc->load('books.xml');

$books = $doc->getElementsByTagName("book");
foreach ($books as $book) {
    $authors = $book->getElementsByTagName("author");
    $author  = $authors->item(0)->nodeValue;
    
    $publishers = $book->getElementsByTagName("publisher");
    $publisher  = $publishers->item(0)->nodeValue;
    
    $titles = $book->getElementsByTagName("title");
    $title  = $titles->item(0)->nodeValue;
    
    echo "$title - $author - $publisher\n";
}
?>

Tuto completo e tem muito mais na Web

https://www.ibm.com/developerworks/br/library/os-xmldomphp/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pela ajuda Williams. Mas ainda assim não estou conseguindo. O problema que encontro são nos itens que tem mesmo nome. Por exemplo:

                <complementos>
		    <complemento id="5">IPVA Pago</complemento>
		    <complemento id="6">Licenciado</complemento>
		    <complemento id="10">Manual do proprietário</complemento>
		</complementos>

Pois o foreach retorna só o primeiro item. E não percorre todos os dados.

Estou usando a biblioteca DOM da seguinte forma:

<?php
// Faz o load do arquivo XML e retorna um objeto
$doc = new DOMDocument();
$doc->load('modelo-axml.xml');

$estoque = $doc->getElementsByTagName("veiculo");
$complementos = $doc->getElementsByTagName("complementos");

foreach ($estoque as $veiculo) {
    $ids = $veiculo->getElementsByTagName("id");
    $id  = $ids->item(0)->nodeValue;
    
    $placas = $veiculo->getElementsByTagName("placa");
    $placa  = $placas->item(0)->nodeValue;
    
    $marcas = $veiculo->getElementsByTagName("marca");
    $marca  = $marcas->item(0)->nodeValue;
    
    $modelos = $veiculo->getElementsByTagName("modelo");
    $modelo  = $modelos->item(0)->nodeValue;
    
    $versoes = $veiculo->getElementsByTagName("versao");
    $versao  = $versoes->item(0)->nodeValue;
    
    $anos = $veiculo->getElementsByTagName("anofabricacao");
    $ano  = $anos->item(0)->nodeValue;
    
    $cambios = $veiculo->getElementsByTagName("cambio");
    $cambio  = $cambios->item(0)->nodeValue;
    
    $kms = $veiculo->getElementsByTagName("km");
    $km  = $kms->item(0)->nodeValue;
    
    $portas = $veiculo->getElementsByTagName("portas");
    $porta  = $portas->item(0)->nodeValue;
    
    $cores = $veiculo->getElementsByTagName("cor");
    $cor  = $cores->item(0)->nodeValue;
    
    $combustiveis = $veiculo->getElementsByTagName("combustivel");
    $combustivel  = $combustiveis->item(0)->nodeValue;
    
    $precos = $veiculo->getElementsByTagName("preco");
    $preco  = $precos->item(0)->nodeValue;
    
    $observacoes = $veiculo->getElementsByTagName("observacao");
    $observacao  = $observacoes ->item(0)->nodeValue;
    
    echo "$id<br>";
    echo "$placa<br>";
    echo "$marca<br>";
    echo "$modelo<br>";
    echo "$versao<br>";
    echo "$ano<br>";
    echo "$cambio<br>";
    echo "$km<br>";
    echo "$porta<br>";
    echo "$cor<br>";
    echo "$combustivel<br>";
    echo "$preco<br>";
    echo "$observacao<br>";
    

		foreach ($complementos as $comp) {
	    $comps = $comp->getElementsByTagName("complemento");
	    $cp  = $comps->item(0)->nodeValue;
	    
	    echo "$cp<br>";
	    }
	
	echo "---------------------------------<br>";

}
?>

E o resultado está sendo o seguinte:

998877
6050
AUDI
A%
2.0 16V Turbo Active
2013
Automático
28160
4
Prata
Flex
R$ 92.900,00
Veículo em excelente estado de conservação.
IPVA Pago
IPVA Pago
---------------------------------
778899
9262
FIAT
PALIO
1.6 MPI Sporting 16V
2013
Manual
33000
4
Branco
Flex
R$ 35.900,00
Veículo revisado, pneus em excelente estado.
IPVA Pago
IPVA Pago
---------------------------------

Como pode ver os últimos itens se repetem "IPVA Pago". Detalhe, estou usando o mesmo XML de exemplo.

Agradeço se puder me ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O nó de complementos esta dentro de veiculos

veja

<veiculo>
	
       ....

	<complementos>
	    <complemento id="5">IPVA Pago</complemento>
	    <complemento id="6">Licenciado</complemento>
	    <complemento id="10">Manual do proprietário</complemento>
	</complementos>

       ....

O que ele esta fazendo lá fora e com DOC e fora do loop do foreach?

$complementos = $doc->getElementsByTagName("complementos");

Correto seria:

$complementos = $veiculo->getElementsByTagName("complementos");
...

echo "$preco<br>";
echo "$observacao<br>";

$complementos = $veiculo->getElementsByTagName("complementos");
foreach ($complementos as $comp) {
    $comps = $comp->getElementsByTagName("complemento");
    $cp  = $comps->item(0)->nodeValue;
    echo "$cp<br>";
}

.....

Para os demais a mesma coisa, acompanhe o nó.

Compartilhar este post


Link para o post
Compartilhar em outros sites

William... você é demais! muitíssimo obrigada pelo tempo que tem dedicado a me ajudar. Porém, ainda não foi desta vez...

Tá acontecendo o seguinte, ele mostra só o primeiro item de complementos. É como se ele não entrasse no segundo loop.

Não sei mais o que tentar... estou desesperada pra resolver isso.

veja o resultado com a alteração que você sugeriu:

998877
6050
AUDI
A5
2.0 16V Turbo Active
2013
Automático
28160
4
Prata
Flex
R$ 92.900,00
Veículo em excelente estado de conservação.
IPVA Pago
---------------------------------
778899
9262
FIAT
PALIO
1.6 MPI Sporting 16V
2013
Manual
33000
4
Branco
Flex
R$ 35.900,00
Veículo revisado, pneus em excelente estado.
IPVA Pago
---------------------------------

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use DOMXPath agora, voce tem um ID no meio ai que eu nem tinha prestado atenção.

Segue um exemplo de uso

http://stackoverflow.com/questions/12547356/retrieve-elements-with-xpath-and-domdocument/12565040#12565040

http://stackoverflow.com/a/12565040/3654014

A Biblioteca Resolve seu problema, mas você tem que da uma estuda em sua biblioteca.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não testei no PHP, mas tente assim.

...
foreach ($estoque as $veiculo) {

    $ids = $veiculo->getElementsByTagName("id");
    echo $id  = $ids->item(0)->nodeValue;
	(...)
	$complementos = $veiculo->getElementsByTagName("complemento");
	
	for ($x = 0; $x < $complementos.length; $x++) {
		echo $complementos->item($x)->nodeValue;
	}
}

Veja uma brincadeira com os nós em JS: https://jsfiddle.net/u8v5o6g1/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kelvim e Williams muito obrigada pelo help. Com a ajuda de vocês e um bocado de pesquisa. Consegui resolver da seguinte maneira:

<?php
// Faz o load do arquivo XML e retorna um objeto
$arquivo_xml = simplexml_load_file('modelo-axml.xml');

// Loop para ler o objeto
for ( $j = 0; $j < count( $arquivo_xml ); $j++ ) {
	// Imprime o valor o valor da tag <id>
	echo $arquivo_xml->veiculo[$j]->id . '<br>';
	
	// Imprime o valor o valor da tag <placa>
	echo $arquivo_xml->veiculo[$j]->placa . '<br>';
	
	// Imprime o valor o valor da <marca>
	echo $arquivo_xml->veiculo[$j]->marca . '<br>';
	
	// Imprime o valor o valor da <modelo>
	echo $arquivo_xml->veiculo[$j]->modelo . '<br>';
	
	// Imprime o valor o valor da <versao>
	echo $arquivo_xml->veiculo[$j]->versao . '<br>';

	// Imprime o valor o valor da <anomodelo>
	echo $arquivo_xml->veiculo[$j]->anomodelo . '<br>';
	
	// Imprime o valor o valor da <image></image>
	echo $arquivo_xml->veiculo[$j]->cambio . '<br>';

	// Imprime o valor o valor da <km>
	echo $arquivo_xml->veiculo[$j]->km . '<br>';

	// Imprime o valor o valor da <potar>
	echo $arquivo_xml->veiculo[$j]->portas . '<br>';

	// Imprime o valor o valor da <cor>
	echo $arquivo_xml->veiculo[$j]->cor . '<br>';

	// Imprime o valor o valor da <combustivel>
	echo $arquivo_xml->veiculo[$j]->combustivel . '<br>';
	
	// Imprime o valor o valor da <preco>
	echo str_replace(".","",substr( $arquivo_xml->veiculo[$j]->preco , 3)). '<br>';

	// Imprime o valor o valor da <observacao>
	echo $arquivo_xml->veiculo[$j]->observacao . '<br>';	

	for ( $l = 0; $l <= 100; $l++ ) {
		if (!empty($arquivo_xml->veiculo[$j]->complementos->complemento[$l])){
		// Imprime o valor o valor dos <complemento>
		echo $arquivo_xml->veiculo[$j]->complementos->complemento[$l] . '<br>';
		}
	}
	
	for ( $g = 0; $g <= 100; $g++ ) {
		if (!empty($arquivo_xml->veiculo[$j]->opcionais->opcional[$g])){
		// Imprime o valor o valor dos <opcionais>
		echo $arquivo_xml->veiculo[$j]->opcionais->opcional[$g] . '<br>';
		}
	}
	
	for ( $v = 0; $v <= 100; $v++ ) {
		if (!empty($arquivo_xml->veiculo[$j]->acessorios->acessorio[$v])){
		// Imprime o valor o valor dos <acessorios>
		echo $arquivo_xml->veiculo[$j]->acessorios->acessorio[$v] . '<br>';
		}
	}

	for ( $y = 0; $y <= 100; $y++ ) {
		if (!empty($arquivo_xml->veiculo[$j]->fotos->foto[$y])){
		// Imprime o valor o valor das <fotos>
		echo $arquivo_xml->veiculo[$j]->fotos->foto[$y] . '<br>';
		}
	}

	// Apenas uma quebra de linha a mais
	echo '<hr>';
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom que deu certo, só tenho uma observação que pode melhorar sua solução.

	for ( $l = 0; $l <= 100; $l++ ) {
		if (!empty($arquivo_xml->veiculo[$j]->complementos->complemento[$l])){
		// Imprime o valor o valor dos <complemento>
		echo $arquivo_xml->veiculo[$j]->complementos->complemento[$l] . '<br>';
		}
	}
	

você está colocando o loop para rodar 100 vezes, imagina duas situações: O xml tem apenas 3 complementos, o for vai se repetir 100 vezes, sendo 97 sem necessidade; Ou se algum dia você importar um arquivo com mais de 100 complementos, ele não vai ler todos.

Sugestão: ao invés de "cravar" 100 iterações, coloque o número de iterações que o objeto tem de nós. se não me engano a propriedade length

	for ( $l = 0; $l <= $arquivo_xml->veiculo[$j]->complementos->complemento->length; $l++ ) {
		if (!empty($arquivo_xml->veiculo[$j]->complementos->complemento[$l])){
		// Imprime o valor o valor dos <complemento>
		echo $arquivo_xml->veiculo[$j]->complementos->complemento[$l] . '<br>';
		}
	}
	

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por Jack Oliveira
      Boa noite galera..
       
      Estou tentando gerar um sitemap com php
       
      So que tenho que por o limit 1200 
       
      mais que isso ele nao gera e se deixar sem limit 
       
      Obs: o banco de dados contem mais de 10 mil registros
      <?php // Data e hora atual $datetime = new DateTime(date('Y-m-d H:i:s')); // A linha abaixo me retornará uma data no seguinte formato: 2017-11-22T00:06:23-02:00 $date = $datetime->format(DateTime::ATOM); // ISO8601 // Gera o arquivo XML do sitemap $xml = '<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> <url> <loc>'.ConfigPainel('site_url').'</loc> <lastmod>'.$date.'</lastmod> <changefreq>weekly</changefreq> <priority>1.00</priority> </url>'; $Query = DBRead('cidades','*',"WHERE status ='1' ORDER BY nome ASC"); if (is_array($Query)) { foreach ($Query as $modcid) { $xml .=' <url> <loc>'.ConfigPainel('site_url').''.$modcid['subdominio'].'/</loc> <lastmod>'.$date.'</lastmod> <changefreq>weekly</changefreq> <priority>1.00</priority> </url>'; //$QueryR = DBRead('directory_guia', '*',"WHERE cidade='{$modcid['id']}' AND status='1' ORDER BY titulo ASC"); $QueryR = DBRead('directory_guia', '*',"WHERE cidade='{$modcid['id']}' AND status='1' ORDER BY titulo ASC LIMIT 1200"); if (is_array($QueryR)) { foreach ($QueryR as $v) { $Queryc = DBRead('cidades', '*',"WHERE id='{$v['cidade']}' ORDER BY nome ASC")[0]; if(empty($v['slug'])) { }else{ $urlseo = ''.ConfigPainel('site_url').''.$Queryc['subdominio'].'/list/'.$v['slug'].'/'; $xml .=' <!-- INICIO DA EMPRESA '.TRIM($v['titulo']).' --> <url> <loc>'.$urlseo.'</loc> <lastmod>'.$date.'</lastmod> <changefreq>weekly</changefreq> <priority>0.85</priority> </url> <!-- FIM DA EMPRESA '.TRIM($v['titulo']).' --> '; } }} }} $xml .= ' </urlset>'; // Abre o arquivo ou tenta cria-lo se ele não exixtir $arquivo = fopen('../sitemap.xml', 'w'); if (fwrite($arquivo, $xml)) { Redireciona('./index.php?sucesso'); } else { Redireciona('?erro'); } fclose($arquivo); // Compactar arquivo sitemap para GZIP $data = implode("", file("sitemap.xml")); $gzdata = gzencode($data, 9); $fp = fopen("sitemap.xml.gz", "w"); fwrite($fp, $gzdata); fclose($fp); // Envia para o Google o novo sitemap gerado $urlSitemap = "http://www.google.com/webmasters/sitemaps/ping?sitemap=".ConfigPainel('site_url').""; // Arquivos a serem enviados $Files = ['sitemap.xml', 'sitemap.xml.gz']; // Envia os dois arquivos sitemap gerados para a URL do Google foreach ($Files as $file) { $url = $urlSitemap . $file; $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); } ?> Caso ouve outra forma que eu possa gerar este sitemap com php fico grato...
    • Por marcelo.ourico
      Estou precisando fazer o envio de um XML via webservice. Estou utilizando PHP 7.4 e nuSoap.

      Porém esse XML de envio possui várias tags com hífen. Por exemplo <tag-name></tag-name>.
       
      Esse hífen tem sido um problema, principalmente por que eu não posso enviar o XML como string. Apenas como objeto. Então imaginem isso:
       
      $objeto = simplexml_load_string($string_xml);  
      Se simplesmente eu tentar resgatar o valor da TAG já dá erro...
       
      $campo1= $objeto->tag-name;
      O erro ocorre em função de que o hífen é um caractere reservado do PHP... Então como resolver?

      Independente disso, quando eu tento fazer o envio via nuSoap, também recebo erro abaixo:
      wsdl->getTypeDef('tag-name', 'http://xyz.abr...')
      wsdl->serializeType('tag-name', 'tag-name', Object(SimpleXMLElement), '

      Alguém já passou por isso? Sabe como resolver? Pode dar uma dica?
    • Por alysson122010
      Gostaria de saber como eu consigo recuperar dados do xml da seguinte forma. Tenho esse meu codigo php
       
      foreach($xml -> cadastros->exame as $item_3){  
                  $codigo = $item_3['codigo']; 
      }
       
      Que recuperar os exames desse xml:
      <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> <resultados versao="20101018" origem="aol" datahora="2021-07-22 08:25:45">     <cadastros>         <pacientes>             <paciente codigo="250058718" codigo_lis="" codigo_aol="250058718" datanasc="" nome=" " sexo="M"/>         </pacientes>         <materiais>             <material codigo="856" descricao="plasma citratado"/>             <material codigo="879" descricao="sangue total EDTA"/>             <material codigo="543" descricao="soro"/>         </materiais>         <exame codigo="TSH" descricao="TSH - HORMÔNIO TIREOESTIMULANTE - Ultrassensivel" dataalteracao="21/11/2019 17:37:15">             <linhasresultado>                 <linha codigo="1240" descricao="TSH - HORMÔNIO TIREOESTIMULANTE Ultrasensivel" unidade="µUI/mL"/>             </linhasresultado>             <valorreferencia><![CDATA[0 a 3 dias: 1,100 a 15,700 µUI/mL 3 dias a 2 meses e 14 dias: 0,600 a 9,200 µUI/mL 2meses 14dias a 1ano 3meses:0,400 a 6,000 µUI/mL 1 ano e 3 meses a 6 anos: 0,400 a 5,200 µUI/mL 6 a 15 anos: 0,300 a 4,200 µUI/mL 15 a 60 anos: 0,400 a 4,300 µUI/mL 60 a 80 anos: 0,400 a 5,800 µUI/mL Superior a 80 anos: 0,400 a 6,700 µUI/mL Gestantes: Primeiro Trimestre: 0,100 a 3,600 µUI/mL Segundo Trimestre: 0,400 a 4,300 µUI/mL Terceiro Trimestre: 0,400 a 4,300 µUI/mL ]]></valorreferencia>         </exame>         <exame codigo="LIPAS" descricao="LIPASE" dataalteracao="28/03/2019 09:23:47">             <linhasresultado>                 <linha codigo="883" descricao="LIPASE" unidade="U/L"/>             </linhasresultado>             <valorreferencia><![CDATA[Inferior a 60,0 U/L]]></valorreferencia>         </exame>         <exame codigo="T4L" descricao="T4 - TIROXINA LIVRE" dataalteracao="16/04/2019 14:43:34">             <linhasresultado>                 <linha codigo="1174" descricao="T4 - TIROXINA LIVRE" unidade="ng/dL"/>             </linhasresultado>             <valorreferencia><![CDATA[0,70 a 1,80  ng/dL]]></valorreferencia>         </exame>         <exame codigo="AMILA" descricao="AMILASE TOTAL" dataalteracao="16/04/2019 12:02:51">             <linhasresultado>                 <linha codigo="83" descricao="AMILASE TOTAL" unidade="U/L"/>             </linhasresultado>             <valorreferencia><![CDATA[Até  115,0 U/L]]></valorreferencia>         </exame>         <exame codigo="FA" descricao="FOSFATASE ALCALINA" dataalteracao="15/04/2019 11:51:01">             <linhasresultado>                 <linha codigo="542" descricao="FOSFATASE ALCALINA" unidade="U/L"/>             </linhasresultado>             <valorreferencia><![CDATA[0 a 14 dias: 82 a 249 U/L 15 dias a 1 ano: 122 a 473 U/L Sexo Feminino: Feminino 1 a 9 anos: 149 a 301 U/L Feminino 10 a 12 anos: 127 a 326 U/L Feminino 13 a 14 anos: 62 a 212 U/L Feminino 15 a 16 anos: 52 a 120 U/L Feminino 17 a 18 anos: 45 a 97 U/L Adultos: 25 a 100 U/L Sexo Masculino: Masculino 1 a 9 anos: 149 a 301 U/L Masculino 10 a 12 anos: 127 a 326 U/L Masculino 13 a 14 anos: 129 a 437 U/L Masculino 15 a 16 anos: 78 a 268 U/L Masculino 17 a 18 anos: 40 a 129 U/L Adultos: 25 a 100 U/L Referência: Fontes R, Cavalari E, Vieira Neto L, et al. Alkaline phosphatase: reference interval transference from CALIPER to a pediatric Brazilian population. J Bras Patol Med Lab. 2018; 54(4): 227-31.]]></valorreferencia>         </exame>         <exame codigo="HBGLI3" descricao="HEMOGLOBINA GLICADA" dataalteracao="28/06/2021 09:26:18">             <linhasresultado>                 <linha codigo="12976" descricao="Hb SA1c - Forma estável" unidade="%"/>                 <linha codigo="16572" descricao="Glicose Média Estimada (GME)" unidade="mg/dL"/>             </linhasresultado>             <valorreferencia><![CDATA[ Hemoglobina Glicada - Hb SA1c Normal: Inferior a 5.7% Risco aumentado para Diabetes Mellitus: 5,7 a 6,4% Diabete Mellitus: Igual ou superior a 6,5% Para o diagnóstico de Diabetes Mellitus a dosagem  de HbA1c deve ser confirmada com novo exame em dia diferente,exceto se houver hiperglicemia inequívo- ca com descompensação metabólica aguda ou sintomas clássicos da doença. A Associação Americana de Diabetes recomenda como  meta para o tratamento de pacientes diabéticos re- sultados de HbA1c iguais ou inferiores a 7%.  Conforme recomendado pela American Diabetes Asso- ciation(ADA) e European Association for the Study  of Diabetes (EASD), estamos liberando cálculo da  glicose média estimada(GME). Este cálculo é obtido a partir do valor de HbA1c através de uma fórmula  matemática baseada em uma relação linear entre os  níveis de HbA1c e a glicose média sanguínea.  Ref. Diabetes Care, 2014; 37 (suppl 1): 81-90/Diretri- zes da Sociedade Brasileira de Diabestes/2013-2014 :9-11.]]></valorreferencia>         </exame>         <exame codigo="COAG4" descricao="COAGULOGRAMA IV" dataalteracao="06/09/2019 14:27:19">             <linhasresultado>                 <linha codigo="14811" descricao="PLAQUETAS - Contagem" unidade="/uL"/>             </linhasresultado>             <valorreferencia><![CDATA[Atividade de Protrombina: 70 a 100% RNI: 0,80 a 1,20 Ratio: Inferior a 1,25 Plaquetas: 150.000 a 450.000/uL RNI - Intervalo de Refêrencias(Alvos Terapeuticos) Recomendações do American College of Physicians, National Heart Lung and Blood Institute for Haematology.]]></valorreferencia>         </exame>     </cadastros>     <solicitacao codigo="238228701" codigo_aol="238228701" paciente="250058718">         <amostras>             <amostra codigo="0" descricao="Basal" material="856"/>             <amostra codigo="1" descricao="Basal" material="879"/>             <amostra codigo="2" descricao="Basal" material="543"/>         </amostras>         <exame codigo="FA" dataresultado="20/07/2021 04:27:20" metodo="Colorimétrico" observacao="" normal="S">             <resultado amostra="2" linharesultado="542" resultado="51,0"/>         </exame>         <exame codigo="HBGLI3" dataresultado="20/07/2021 05:48:28" metodo="Imunoensaio Turbidimétrico de Inibição " observacao="" normal="S">             <resultado amostra="1" linharesultado="12976" resultado="5,1"/>             <resultado amostra="1" linharesultado="16572" resultado="100"/>         </exame>         <exame codigo="TSH" dataresultado="20/07/2021 04:27:20" metodo="Eletroquimioluminescência" observacao="Considerar a metodologia Quimioluminescência para a análise deste teste." normal="S">             <resultado amostra="2" linharesultado="1240" resultado="2,000"/>         </exame>         <exame codigo="AMILA" dataresultado="20/07/2021 04:27:20" metodo="Colorimétrico Enzimático" observacao="Considerar a metodologia Quimioluminescência para a análise deste teste." normal="S">             <resultado amostra="2" linharesultado="83" resultado="83,0"/>         </exame>         <exame codigo="COAG4" dataresultado="21/07/2021 13:29:20" metodo="Coagulométrico/Sistema Automatizado" observacao="" normal="S">             <resultado amostra="0" linharesultado="14811" resultado="305000"/>         </exame>         <exame codigo="LIPAS" dataresultado="20/07/2021 04:27:20" metodo="Colorimétrico Enzimático" observacao="" normal="S">             <resultado amostra="2" linharesultado="883" resultado="47,0"/>         </exame>         <exame codigo="T4L" dataresultado="20/07/2021 04:27:20" metodo="Eletroquimioluminescência" observacao="Considerar a metodologia Quimioluminescência para a análise deste teste." normal="S">             <resultado amostra="2" linharesultado="1174" resultado="1,16"/>         </exame>     </solicitacao> </resultados>  
      Até ai consegui e conseguir mostrar o valor de codigo="codigo do exame". Porém preciso fazer uma segunda consulta da parte :
       
       
      <solicitacao codigo="238228701" codigo_aol="238228701" paciente="250058718">         <amostras>             <amostra codigo="0" descricao="Basal" material="856"/>             <amostra codigo="1" descricao="Basal" material="879"/>             <amostra codigo="2" descricao="Basal" material="543"/>         </amostras>         <exame codigo="FA" dataresultado="20/07/2021 04:27:20" metodo="Colorimétrico" observacao="" normal="S">             <resultado amostra="2" linharesultado="542" resultado="51,0"/>         </exame>         <exame codigo="HBGLI3" dataresultado="20/07/2021 05:48:28" metodo="Imunoensaio Turbidimétrico de Inibição " observacao="" normal="S">             <resultado amostra="1" linharesultado="12976" resultado="5,1"/>             <resultado amostra="1" linharesultado="16572" resultado="100"/>         </exame>         <exame codigo="TSH" dataresultado="20/07/2021 04:27:20" metodo="Eletroquimioluminescência" observacao="Considerar a metodologia Quimioluminescência para a análise deste teste." normal="S">             <resultado amostra="2" linharesultado="1240" resultado="2,000"/>         </exame>         <exame codigo="AMILA" dataresultado="20/07/2021 04:27:20" metodo="Colorimétrico Enzimático" observacao="Considerar a metodologia Quimioluminescência para a análise deste teste." normal="S">             <resultado amostra="2" linharesultado="83" resultado="83,0"/>         </exame>         <exame codigo="COAG4" dataresultado="21/07/2021 13:29:20" metodo="Coagulométrico/Sistema Automatizado" observacao="" normal="S">             <resultado amostra="0" linharesultado="14811" resultado="305000"/>         </exame>         <exame codigo="LIPAS" dataresultado="20/07/2021 04:27:20" metodo="Colorimétrico Enzimático" observacao="" normal="S">             <resultado amostra="2" linharesultado="883" resultado="47,0"/>         </exame>         <exame codigo="T4L" dataresultado="20/07/2021 04:27:20" metodo="Eletroquimioluminescência" observacao="Considerar a metodologia Quimioluminescência para a análise deste teste." normal="S">             <resultado amostra="2" linharesultado="1174" resultado="1,16"/>         </exame>     </solicitacao>  
      Onde eu consiga pegar o codigo que recuperei acima e liste os resultados da parte de solicitacao referente ao codigo="codigo do exame que eu listei a cima" mas nao to conseguindo fazer. Como eu posso fazer isso?
    • Por ILR master
      Fala pessoal.
       
      Estou importando um arquivo xml para o meu DB porém, não consigo ler o campo data do xml. Todos os campos são lidos, menos o campo data. No xml ele está nesse formato: 09/06/2021 23:59:00
      Abaixo segue o código que estou usando:
       
      $xml = simplexml_load_file('cupons.xml');
      foreach($xml->coupon as $cupom) {
          echo $cupom->code.'<br>';
          echo $cupom->data.'<br>';
      }
       
      Obrigado!
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.