Ir para conteúdo

POWERED BY:

Arquivado

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

Renato Reis 7

[Resolvido] Problema com Codificacao de texto de XML para PHP

Recommended Posts

Pessoal, bom dia.

 

To com um problema aqui.

 

Tenho uma arquivo XML que nao tem a tag <?xml version="1.0" encoding="iso8859-1"?> informando qual é sua codificacao, porem este xml contem "Ç" "Ã" e outras palavras acentuadas.

 

Entao na hora que eu jogo no simplexml esse arquivo, da pau. Eu nao to conseguindo uma solucao para resolver esse problema.

 

Eu nao tenho experiencia em PHP nem em XML, mas estou conseguindo desembolar aos poucos.

 

Pelos testes que fiz: se eu botar essa tag do XML dentro do XML, funciona, porem, nao tenho como editar pois o XML é gerado de minuto em minuto. Uma forma seria ao executar o php, ele abrir e alterar o XML. Tem como?

 

Outra forma é eu conseguir resolver esse problema da codificacao, deixando XML intacto, e colocando alguma funcao no PHP. Vou mandar um trecho do PHP e o codigo php inteiro.

 

Abs.

 

 XML

<SISTEMA>
 <ATIVIDADE>
   <NOME>Construção</NOME>
   <SENHAS>0</SENHAS>
   <ATENDIMENTOS>5</ATENDIMENTOS>
   <MEDIAATENDIMENTO>0:04:24</MEDIAATENDIMENTO>
   <MEDIAESPERA>0:04:47</MEDIAESPERA>
 </ATIVIDADE>
</SISTEMA>

 

<html>

<?php




   $xml = simplexml_load_file("teste.xml");


   echo "<table>";
   echo "<tr>";
echo "<td>"; 
   echo "<b>";
   echo ($xml -> ATIVIDADE -> NOME); 
   echo "</b>";
   echo "</td>";
echo "</tr>";

echo "<tr>";
echo "<td>"; 
   echo "Senhas: " ;
   echo "</td>";
   echo "<td>";
   echo ($xml-> ATIVIDADE->SENHAS);
   echo "</td>";
echo "</tr>";

echo "<tr>";
echo "<td>"; 
   echo "Qtd Atendimentos: " ;
   echo "</td>";
   echo "<td>";
   echo ($xml-> ATIVIDADE->ATENDIMENTOS);
   echo "</td>";
echo "</tr>";

echo "<tr>";
echo "<td>"; 
   echo "Tempo Medio de Atendimento: " ;
   echo "</td>";
   echo "<td>";
   echo ($xml-> ATIVIDADE->MEDIAATENDIMENTO);
   echo "</td>";
echo "</tr>";

echo "<tr>";
echo "<td>"; 
   echo "Tempo Medio de Espera: " ;
   echo "</td>";
   echo "<td>";
   echo ($xml-> ATIVIDADE->MEDIAESPERA);
   echo "</td>";
echo "</tr>";


echo "</table>";

?>
</html>

 

Me ajudem por favor!!!

 

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tentou mudar o encoding para "UTF-8"?

 

para abrir o arquivo você pode usar fopen()

 

exemplo

 

<?php
$handle = fopen("c:\\folder\\resource.xml", "r");
?>

 

onde

 

'r' Abre somente para leitura; coloca o ponteiro do arquivo no começo do arquivo.

 

'r+' Abre para leitura e escrita; coloca o ponteiro do arquivo no começo do arquivo.

 

'w' Abre somente para escrita; coloca o ponteiro do arquivo no começo do arquivo e reduz o comprimento do arquivo para zero. Se o arquivo não existir, tenta criá-lo.

 

'w+' Abre para leitura e escrita; coloca o ponteiro do arquivo no começo do arquivo e reduz o comprimento do arquivo para zero. Se o arquivo não existir, tenta criá-lo.

 

'a' Abre somente para escrita; coloca o ponteiro do arquivo no final do arquivo. Se o arquivo não existir, tenta criá-lo.

 

'a+' Abre para leitura e escrita; coloca o ponteiro do arquivo no final do arquivo. Se o arquivo não existir, tenta criá-lo.

 

'x' Cria e abre o arquivo somente para escrita; coloca o ponteiro no começo do arquivo. Se o arquivo já existir, a chamada a fopen() falhará, retornando FALSE e gerando um erro de nível E_WARNING. Se o arquivo não existir, tenta criá-lo. Isto é equivalente a especificar as flags O_EXCL|O_CREAT para a chamada de sistema open(2).

 

'x+' Cria e abre o arquivo para leitura e escrita; coloca o ponteiro no começo do arquivo. Se o arquivo já existir, a chamada a fopen() falhará, retornando FALSE e gerando um erro de nível E_WARNING. Se o arquivo não existir, tenta criá-lo. Isto é equivalente a especificar as flags O_EXCL|O_CREAT para a chamada de sistema open(2).

 

 

qualquer duvida da uma olhada aqui http://www.php.net/manual/pt_BR/function.fopen.php

 

 

abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ja tentei sim.

 

 

Sera que com esse FOPEN eu consigo adicionar a linha "<?xml..." dentro do arquivo .xml?

 

pq se eu conseguisse inserir essa linha que quero, dentro do arquivo XML, e depois ele for aberto... Ai o que eu preciso vai funcionar.

 

 

Da uma ajuda no uso de fopen ai brother.

 

obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

//ler o arquivo xml sem tag
$ar = file('teste.xml');
$tag[] = '';


//desmembra o array $ar
foreach($ar as $conteudoo){
       //armazena em array
$tag[] .= trim($conteudoo);
}

//verifica se contem tag
//caso na tenha adiciona a tag
$le = trim($tag[1]);
if($le == "<?xml version=\"1.0\" encoding=\"utf-8\"?>"){
	array_shift($tag);
	}else{
		array_unshift($tag, "<?xml version=\"1.0\" encoding=\"utf-8\"?>");
		}

		//abre o arquivo apaga, e insere a tag
		#var_dump($tag);
	if($tag[0] == "<?xml version=\"1.0\" encoding=\"utf-8\"?>"){
	$conn = fopen('teste.xml','w');
	fwrite($conn,$tag[0]);
	array_shift($tag);
	fclose($conn);
	}
	    //insere o conteuudo apos a tag
	    $con = fopen('teste.xml','a');
		foreach($tag as $drive)
		{
			fwrite($con,"\n{$drive}");
			}

Se o \n não pular a linha utiliza o \r

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, usando a classe DOMDocument fica fácil :thumbsup:

 

<?php

header( 'Content-type: text/html; charset=UTF-8' );

$xml = <<<XML
<SISTEMA>
 <ATIVIDADE>
   <NOME>Construção</NOME>
   <SENHAS>0</SENHAS>
   <ATENDIMENTOS>5</ATENDIMENTOS>
   <MEDIAATENDIMENTO>0:04:24</MEDIAATENDIMENTO>
   <MEDIAESPERA>0:04:47</MEDIAESPERA>
 </ATIVIDADE>
</SISTEMA>
XML;

$DOMDocument = new DOMDocument( '1.0', 'UTF-8' );
$DOMDocument->preserveWhiteSpace = false;
$DOMDocument->loadXML( $xml );

foreach( $DOMDocument->getElementsByTagName( 'ATIVIDADE' ) as $childNodes )
{
   foreach( $childNodes->childNodes as $childNode )
   {
       printf( '<strong>%s:</strong>%s<br/>', $childNode->nodeName, $childNode->nodeValue );
   }
}

 

Saída

NOME:Construção
SENHAS:0
ATENDIMENTOS:5
MEDIAATENDIMENTO:0:04:24
MEDIAESPERA:0:04:47

Compartilhar este post


Link para o post
Compartilhar em outros sites

//ler o arquivo xml sem tag
$ar = file('teste.xml');
//tag
$tag[] = '<?xml version="1.0" encoding="utf-8"?>'."\n";
//desmembra o array $ar
foreach($ar as $conteudoo){
       //armazena em array
$tag[] .= $conteudoo;
}
//ler e limpa o arquivo a inserir
$ler = fopen('teste.xml','w');
foreach($tag as $gravar){
fwrite($ler,"{$gravar}\n");
}

Se o \n não pular a linha utiliza o \r

 

 

Vou testar aqui cara. Vamos ver uma boa solucao para esse problema!!

 

Valeu!

 

Carlos, obrigado pela ajuda.

 

Mas eu vi aqui, testei e funcionou, mas você inseriu os dados xml dentro do PHP certo?

 

Acontece que estes dados sao alterados de 1 em 1 minuto dentro do arquivo xml.

 

Ai nao teria como este codigo ficar estatico.

 

To falando besteira?!?!

 

Abs

 

Quando tento ler o arquivo XML com acento sempre da a zica

 

ai vai o erro

 Warning: DOMDocument::load() [domdocument.load]: Input is not proper UTF-8, indicate encoding ! Bytes: 0xE7 0xE3 0x6F 0x20 in file:///C:/Arquivos%20de%20programas/EasyPHP-5.3.9/www/novo_php/teste_2.xml, line: 3 in C:\Arquivos de programas\EasyPHP-5.3.9\www\novo_php\teste2.php on line 7

 

tem um jeito disso tudo resolver. Tem como adicionar a tag do XML dentro do arquivo xml?

Compartilhar este post


Link para o post
Compartilhar em outros sites

//ler o arquivo xml sem tag
$ar = file('teste.xml');
$tag[] = '';


//desmembra o array $ar
foreach($ar as $conteudoo){
       //armazena em array
$tag[] .= trim($conteudoo);
}

//verifica se contem tag
//caso na tenha adiciona a tag
$le = trim($tag[1]);
if($le == "<?xml version=\"1.0\" encoding=\"utf-8\"?>"){
	array_shift($tag);
	}else{
		array_unshift($tag, "<?xml version=\"1.0\" encoding=\"utf-8\"?>");
		}

		//abre o arquivo apaga, e insere a tag
		#var_dump($tag);
	if($tag[0] == "<?xml version=\"1.0\" encoding=\"utf-8\"?>"){
	$conn = fopen('teste.xml','w');
	fwrite($conn,$tag[0]);
	array_shift($tag);
	fclose($conn);
	}
	    //insere o conteuudo apos a tag
	    $con = fopen('teste.xml','a');
		foreach($tag as $drive)
		{
			fwrite($con,"\n{$drive}");
			}

Se o \n não pular a linha utiliza o \r

 

 

Perfeito cara. Fiz as alteracoes. Tirei do UTF-8 para iso8859-1, que eh o que funciona.

Agora eu tenhoq colocar esse script antes de carregar o simple_xml, ne isso?

 

 

Agora vou testar aqui, mas de qualquer forma obrigado.

 

valeu!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php

$file     = INSIRA AQUI O CAMINHO DO ARQUIVO XML
$xml      = simplexml_load_string('<?xml version="1.0" encoding="iso-8859-1" ?>' . file_get_contents($handler));

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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