Array
(
)

Gravar dados XML.

PHP
Rumao
   - 03 dez 2013

Boa tarde, estou com algumas dificuldades para gravar os valores de uma Session em um arquivo XML, se alguém puder ajudar agradeço.
Segue o que fiz até agora.
#Código
<?php
print_r($_SESSION[''''carrinho'''']);
//Grava Orçamento em XML
$txt = ''''<?xml version="1.0" encoding="utf-8"?>''''."\n";
$caminhoOrcamento = PATHORCAMENTO.$_SESSION[''''autUser''''][''''NOMELOJA_USU''''].$_SESSION[''''autUser''''][''''APELIDOLOJA_USU''''].''''/'''';
$conteudo = "";
$conteudo .= "<orcamento>\n";
$conteudo .= " <dados>\n";
$conteudo .= " <cliente>".$_SESSION[''''veiculo''''][''''consumidor''''] = CLIENTENAME."</cliente>\n";
$conteudo .= " <modelo>".$_SESSION[''''veiculo''''][''''nome'''']."</modelo>\n";
$conteudo .= " <ano>".$_SESSION[''''veiculo''''][''''ano'''']."</ano>\n";
$conteudo .= " <placa>".$_SESSION[''''veiculo''''][''''placa'''']."</placa>\n";
$conteudo .= " </dados>\n";
foreach($_SESSION[''''carrinho''''] as $id => $qtd){
$sql = "SELECT * FROM subdivisoes WHERE CODIGO_SUB = ''''$id''''";
$qry = mysql_query($sql)or die(mysql_error());
$ln = mysql_fetch_assoc($qry);
$id = $ln[''''CODIGO_SUB''''];
$nome = $ln[''''NOME_SUB''''];

$conteudo .= " <produto>\n";
$conteudo .= " <codigo>$id</codigo>\n";
$conteudo .= " <descricao>$nome</descricao>\n";
$conteudo .= " <quantidade>$qtd</quantidade>\n";
$conteudo .= " </produto>\n";
}
$conteudo .= "</orcamento>";
$xml = $txt.$conteudo;
$arquivo = $_SESSION[''''veiculo''''][''''placa''''].".xml";
$arquivo = fopen($caminhoOrcamento.$arquivo,''''w+'''');
if($arquivo == false):
echo ''''Não foi possíbel criar o arquivo!'''';
else:
fwrite($arquivo,$xml);
echo ''''<div class="alert alert-block alert-success msg"><strong>Sucesso! </strong>Orçamento Gravado com Sucesso!</div>'''';
unset($_SESSION[''''carrinho'''']);
header(''''Refresh: 3;url=categorias.php'''');
endif;
fclose($arquivo);

O que está sendo gerado no momento é assim:
#Código
<?xml version="1.0" encoding="utf-8"?>
<orcamento>
<dados>
<cliente>CONSUMIDOR</cliente>
<modelo>MARRUÁ 2.8 12V 132cv TDI Diesel</modelo>
<ano>2004 Diesel</ano>
<placa>DDP-2297</placa>
</dados>
<produto>
<codigo>17</codigo>
<descricao>RODAS NOVAS</descricao>
<quantidade>4</quantidade>
</produto>
<produto>
<codigo>1</codigo>
<descricao>PALHETAS</descricao>
<quantidade>1</quantidade>
</produto>
<produto>
<codigo>15</codigo>
<descricao>PNEUS NOVOS</descricao>
<quantidade>4</quantidade>
</produto>
</orcamento>

Preciso que na tag <produto> seja incrementado + 1 sempre que for gerado um novo produto, mas não consegui resolver este problema, para ficar assim:
<produto1>
<produto2>
etc..
E o que fiz até o momento está correto? Ainda estou testando, mas está gerando os dados que preciso o caminho é este mesmo ou teria algo mais simples para ser feito?
Desde já obrigado pela atenção.

Rumao
   - 04 dez 2013

Mudei um pouco o esquema que estou fazendo, está funcionando em partes.
Código atual:
#Código
<?php
//Caminho e nome do arquivo usado para gravar o XML
$caminhoOrcamento = PATHORCAMENTO.$_SESSION['autUser']['NOMELOJA_USU'].$_SESSION['autUser']['APELIDOLOJA_USU'].'/';
$arquivo = $_SESSION['veiculo']['placa'].".xml";
$arquivo = fopen($caminhoOrcamento.$arquivo,'w+');

//Dados do arquivo XML
fwrite($arquivo, '<?xml version="1.0" encoding="utf-8"?>');
fwrite($arquivo, '<orcamento>'.PHP_EOL);
fwrite($arquivo, ' <dados>'.PHP_EOL);
fwrite($arquivo, ' <modelo>'.$_SESSION['veiculo']['nome'].'</modelo>'.PHP_EOL);
fwrite($arquivo, ' <ano>'.$_SESSION['veiculo']['ano'].'</ano>'.PHP_EOL);
fwrite($arquivo, ' <placa>'.$_SESSION['veiculo']['placa'].'</placa>'.PHP_EOL);
fwrite($arquivo, ' </dados>'.PHP_EOL);

$cod = 0;
foreach($_SESSION['carrinho'] as $id => $qtd):
$sql = "SELECT * FROM subdivisoes WHERE CODIGO_SUB = '$id'";
$qry = mysql_query($sql)or die(mysql_error());
$ln = mysql_fetch_assoc($qry);

$id = $ln['CODIGO_SUB'];
$nome = $ln['NOME_SUB'];

$cod++;
fwrite($arquivo, '<produto $cod>'.PHP_EOL);
fwrite($arquivo, ' <seq>'.$cod.'</seq>'.PHP_EOL);
fwrite($arquivo, ' <descricao>'.$nome.'</descricao>'.PHP_EOL);
fwrite($arquivo, ' <quantidade>'.$qtd.'</quantidade>'.PHP_EOL);
fwrite($arquivo, '</produto>'.PHP_EOL);
endforeach;
fwrite($arquivo, '</orcamento>');
fclose($arquivo);


Estou conseguindo contar como preciso, mas o problema é que quando coloco a variável dentro do nó <produto> dá erro no xml. A tag <seq> é só para exemplificar.
Preciso que seja gravado assim:
<codigo1>
<codigo2>....

Alguém já fez algo parecido com XML? Desde já obrigado pela atenção.

Rumao
   - 04 dez 2013

Consegui finalizar segue resultado final para se alguém precisar do mesmo.

#Código
<?php
//Caminho e nome do arquivo usado para gravar o XML
$caminhoOrcamento = PATHORCAMENTO.$_SESSION['autUser']['NOMELOJA_USU'].$_SESSION['autUser']['APELIDOLOJA_USU'].'/';
$arquivo = $_SESSION['veiculo']['placa'].".xml";
$arquivo = fopen($caminhoOrcamento.$arquivo,'w+');

//Dados do arquivo XML
fwrite($arquivo, '<?xml version="1.0" encoding="utf-8"?>');
fwrite($arquivo, '<orcamento>');
fwrite($arquivo, ' <dados>');
fwrite($arquivo, ' <modelo>'.$_SESSION['veiculo']['nome'].'</modelo>');
fwrite($arquivo, ' <ano>'.$_SESSION['veiculo']['ano'].'</ano>');
fwrite($arquivo, ' <placa>'.$_SESSION['veiculo']['placa'].'</placa>');
fwrite($arquivo, ' </dados>');

$cod = 0;
foreach($_SESSION['carrinho'] as $id => $qtd):
$sql = "SELECT * FROM subdivisoes WHERE CODIGO_SUB = '$id'";
$qry = mysql_query($sql)or die(mysql_error());
$ln = mysql_fetch_assoc($qry);

$id = $ln['CODIGO_SUB'];
$nome = $ln['NOME_SUB'];

$cod++;
fwrite($arquivo, ' <produto cod="'.$cod.'">');
fwrite($arquivo, ' <descricao>'.$nome.'</descricao>');
fwrite($arquivo, ' <quantidade>'.$qtd.'</quantidade>');
fwrite($arquivo, ' </produto>');
endforeach;
fwrite($arquivo, '</orcamento>');

if(!$arquivo):
echo 'Não foi possíbel criar o arquivo!';
else:
echo '<div class="alert alert-block alert-success msg"><strong>Sucesso! </strong>Orçamento Gravado com Sucesso!</div>';
unset($_SESSION['carrinho']);
header('Refresh: 3;url=categorias.php');
endif;
fclose($arquivo);


Como sou iniciante talvez a lógica não esteja das melhores e pudesse ser feito de uma outra forma mais rápida e fácil, mas de qualquer forma está me atendendo no momento e no futuro posso melhorar quem sabe né?