Ir para conteúdo

Arquivado

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

Chello Fotógrafo

CDATA, erro de interpretação

Recommended Posts

Caros foristas,

 

Estou desesperado com um enorme problema em mãos, ou melhor, em código!

Tenho um script PHP que lê os dados de um XML e apresenta na tela. No XML utilizei CDATA para evitar os problemas com caracteres especiais. Acontece que ao carregar o conteúdo vindo da tag <texto> do XML (que recebeu os dados de um textarea), quando há quebra de linha nesse conteúdo simplesmente o PHP retorna uma variável vazia. Já quando não há quebra, aparece normalmente.

Como aqui na instituição que trabalho a burocracia para alterar qualquer coisa no servidor é grande, a versão do PHP não tem DOM habilitado e precisei recorrer ao "file_get_contents" + Expressão Regular para extrair as informações do XML.

Já tentei de tudo, como substituir "\n","\t", \"r", "nl2br", "<pre>". Estou há 3 dias vasculhando na net e não achei nada que me ajude. Estou com o prazo super estourado para mostrar esse trabalho para o chefe e já não sei o que fazer.

 

Abaixo meus códigos:

 

XML

 

<?xml version="1.0" encoding="iso-8859-1"?>
<materias>
	<clipping>
		<midia><![CDATA[Jornais]]></midia>
		<veiculo><![CDATA[Folha de S.Paulo]]></veiculo>
		<ancora></ancora>
		<editoria><![CDATA[Folha de S.Paulo | Cotidiano]]></editoria>
		<titulo><![CDATA[Titulo matéria 1]]></titulo>
		<subtitulo><![CDATA[sub materia 1]]></subtitulo>
		<autor><![CDATA[Marcelo]]></autor>
		<citacao>s</citacao>
		<texto><![CDATA[Testando a quebra de linha, com novos ajustes no xml e no script. Vamos tentar fazer isso funcionar agora!

ok?

Confirme por favor!]]></texto>
	</clipping>
	<clipping>
		<midia><![CDATA[Jornais]]></midia>
		<veiculo><![CDATA[Diário de S.Paulo]]></veiculo>
		<ancora></ancora>
		<editoria><![CDATA[Diário de S.Paulo | Cidades]]></editoria>
		<titulo><![CDATA[Titulo matéria 2]]></titulo>
		<subtitulo><![CDATA[sub matéria 2]]></subtitulo>
		<autor><![CDATA[Chello]]></autor>
		<citacao>n</citacao>
		[b]<texto><![CDATA[E agora, sem quebra!]]></texto>[/b]
	</clipping>
</materias>

Como eu disse, no primeiro registro os dados do campo <texto> são interpretados e exibidos corretamente pelo PHP, já no que tem quebra nada é recuperado.

 

Abaixo o script PHP

 

<?php
//carrega arquivo XML
$xml = file_get_contents($_SERVER{'DOCUMENT_ROOT'}."/aci/clipping/arquivos/100110.xml");
//Carrega bloco de dados
preg_match_all( "/\<clipping\>(.*?)\<\/clipping\>/s", $xml, $blocodados);
foreach( $blocodados[1] as $bloco ) {
  preg_match_all( "/\<ancora\>(.*?)\<\/ancora\>/", $bloco, $ancora );
  preg_match_all( "/\<editoria\>(.*?)\<\/editoria\>/", $bloco, $editoria );
  preg_match_all( "/\<titulo\>(.*?)\<\/titulo\>/", $bloco, $titulo );
  preg_match_all( "/\<subtitulo\>(.*?)\<\/subtitulo\>/", $bloco, $subtitulo );
  preg_match_all( "/\<autor\>(.*?)\<\/autor\>/", $bloco, $autor );
  preg_match_all( "/\<citacao\>(.*?)\<\/citacao\>/", $bloco, $citacao );
  preg_match_all( "/\<texto\>(.*?)\<\/texto\>/", $bloco, $texto );	
  
  //Converte CDATA
  $editoria = str_replace("<![CDATA[","",$editoria[1][0]);
  $editoria = str_replace("]]>","",$editoria);			
  $titulo = str_replace("<![CDATA[","",$titulo[1][0]);
  $titulo = str_replace("]]>","",$titulo);
  $subtitulo = str_replace("<![CDATA[","",$subtitulo[1][0]);
  $subtitulo = str_replace("]]>","",$subtitulo);
  $autor = str_replace("<![CDATA[","",$autor[1][0]);
  $autor = str_replace("]]>","",$autor);			
  $texto = str_replace("<![CDATA[","",$texto[1][0]);
  $texto = str_replace("]]>","",$texto);
  $texto = str_replace(array("\r", "\n", "\t", "\s"), "", $texto);

  //Exibe a materia
  echo "<p>";
  echo "<a name=\"".$ancora[1][0]."\"></a><br>";
  echo "<span class=\"clipping-EDITORIA-DATA\">".$editoria."</span><br>";
  echo "<span class=\"clipping-MateriaTitulo\">".$titulo."</span><br>";
  //Se existir subtitulo
  if($subtitulo) { echo "<span class=\"clipping-MateriaSubtitulo\">".$subtitulo."</span><br>"; }
  //Se existir autor
  if($autor) { echo "<span class=\"clipping-MateriaAutor\">".$autor."</span><br>"; }
  //Se foi citada
  if($citacao[1][0] == "s") { echo "<span class=\"clipping-Citada\">citada</span>"; }
  echo "</p>";
  echo "<p style=\"None\"><pre>".$texto."</pre><br><a href=\"#indice\" class=\"linksTopoAzul\">[voltar ao índice]</a></p><p><br><br><br><br><br></p>";
}
?>

Acima, que já utilizei com e sem str_replace para os "\n" e "\r" da vida no trecho de conversão das variáveis e, também já utilizei com e sem "<pre>" e com e sem "nl2br" onde apresento o conteúdo do campo <texto>, mas sem êxito quando tem a mardita quebra de linha!!

 

Por favor, algum bom samaritano para me socorrer!!!!

 

Desde já agradeço imensamente pela atenção!

 

Abs

Chello

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que você está lendo o XML com expressão regular e isso é totalmente errado. Existem ferramentas para esse fim:

 

SimpleXML

XMLReader

DOM

 

Utilizando DOM com XPath você poderia implementar assim:

$dom = new DOMDocument();
$dom->loadXML( $xml );

$xpath = new DOMXPath( $dom );

foreach ( $xpath->query( './/clipping') as $clipping ){
$nodes = array();

foreach ( $xpath->query( './/*' , $clipping ) as $node )
	$nodes[ $node->nodeName ] = $node->nodeValue;

echo "<p>";
echo "<a name=\"".$nodes[ 'ancora' ]."\"></a><br>";
echo "<span class=\"clipping-EDITORIA-DATA\">".$nodes[ 'editoria' ]."</span><br>";
echo "<span class=\"clipping-MateriaTitulo\">".$nodes[ 'titulo' ]."</span><br>";

//Se existir subtitulo
if( !empty( $nodes[ 'subtitulo' ] ) )
	echo "<span class=\"clipping-MateriaSubtitulo\">".$nodes[ 'subtitulo' ]."</span><br>";

//Se existir autor
if( !empty( $nodes[ 'autor' ] ) )
	echo "<span class=\"clipping-MateriaAutor\">".$nodes[ 'autor' ]."</span><br>";

//Se foi citada
if( $nodes[ 'citacao' ] == 's' )
	echo "<span class=\"clipping-Citada\">citada</span>";

echo "</p>";
echo "<p style=\"None\">".nl2br( $nodes[ 'texto' ] )."<br><a href=\"#indice\" class=\"linksTopoAzul\">[voltar ao índice]</a></p><p><br><br><br><br><br></p>";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poxa João,

 

Agradeço demais a resposta tão rápida, porém não deu certo. Troquei a var $xml por "$_SERVER{'DOCUMENT_ROOT'}."/aci/clipping/arquivos/100110.xml" - caminho do arquivo - porém no navegador me retorna o erro:

Warning: domdocument() expects at least 1 parameter, 0 given in /export/WWW/wwwroot/aci/clipping/teste.php on line 3

 

Fatal error: Call to undefined function: loadxml() in /export/WWW/wwwroot/aci/clipping/teste.php on line 4

 

Se puder me dar uma luz, agradeço demais!

 

Forte abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Versão 4.4.4

 

Mas, como eu citei na minha mensagem inicial, aqui é uma instituição pública onde todo e qualquer processo de mudança nos sistemas e servidores tem que percorrer uma longa estrada de burocracia!!!

 

Não existe uma outra maneira? Nesta versão que temos aqui há como pelo menos habilitar essa classe do DOM?

 

Abs e mais uma vez muitíssimo obrigado!

 

Chello

 

 

Você está utilizando PHP 4 ????

 

Sugiro fortemente que atualize.

 

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.