Estou lendo um xml em php usando simplexml_load_file
. No entanto, ao tentar carregar o xml, ele exibe uma lista de avisos
Warning: simplexml_load_file() [function.simplexml-load-file]: <project orderno="6" campaign_name="International Relief & Development" project in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: ional Relief & Development" project_id="313" client_name="International Relief & in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3
Como retifico para remover esses avisos?
(XML é gerado a partir de url http://..../index.php/site/projects
e carregado em uma variável no test.php. Não tenho privilégios de gravação para index.php)
@
antessimplexml_load_file
ou adicionando um sinalizador, consulte a página de manual desimplexml_load_file
para mais informações e exclua sua pergunta, é uma duplicata.Respostas:
O XML é provavelmente inválido.
O problema pode ser o "&"
$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text);
irá livrar-se do "&" e substituí-lo pela sua versão de código HTML ... experimente.
fonte
$text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&', $text);
Encontrei isso aqui ...
fonte
Tente limpar o HTML primeiro usando esta função:
$html = htmlspecialchars($html);
Os caracteres especiais geralmente são representados de forma diferente em HTML e podem ser confusos para o compilador. Como
&
se torna&
.fonte
htmlspecialchars()
é a função precisa para converter&, ", <, >
chars nos dados do elemento.htmlspecialchars()
e não quebrar XML. Tentei alguns sinalizadores e meu XML ainda quebrou.htmlspecialchars
no conteúdo de uma tag xml, não em todo o XMLEu uso uma versão combinada:
strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&",$textorhtml))
fonte
simplexml_load_file
está gerando um erro de análiseparser error : xmlParseEntityRef
ao tentar carregar o arquivo XML de um URL.&
valor em vez de&
. É bem possível que existam outros erros que não sejam óbvios neste momento.simplexml_load_file
função PHP , mas parece que não temos nenhum controle sobre como o XML é criado.simplexml_load_file
processamento de um arquivo XML inválido. Isso não nos deixa com muitas opções, além de corrigir o próprio arquivo XML.Converter XML inválido em XML válido. Isso pode ser feito usando
PHP tidy extension
. Mais instruções podem ser encontradas em http://php.net/manual/en/book.tidy.phpAssim que tiver certeza de que a extensão existe ou está instalada, faça o seguinte.
/** * As per the question asked, the URL is loaded into a variable first, * which we can assume to be $xml */ $xml = <<<XML <?xml version="1.0" encoding="UTF-8"?> <project orderno="6" campaign_name="International Relief & Development for under developed nations"> <invalid-data>Some other data containing & in it</invalid-data> <unclosed-tag> </project> XML; /** * Whenever we use tidy it is best to pass some configuration options * similar to $tidyConfig. In this particular case we are making sure that * tidy understands that our input and output is XML. */ $tidyConfig = array ( 'indent' => true, 'input-xml' => true, 'output-xml' => true, 'wrap' => 200 ); /** * Now we can use tidy to parse the string and then repair it. */ $tidy = new tidy; $tidy->parseString($xml, $tidyConfig, 'utf8'); $tidy->cleanRepair(); /** * If we try to output the repaired XML string by echoing $tidy it should look like. <?xml version="1.0" encoding="utf-8"?> <project orderno="6" campaign_name="International Relief & Development for under developed nations"> <invalid-data>Some other data containing & in it</invalid-data> <unclosed-tag></unclosed-tag> </project> * As you can see that & is now fixed in campaign_name attribute * and also with-in invalid-data element. You can also see that the * <unclosed-tag> which didn't had a close tag, has been fixed too. */ echo $tidy; /** * Now when we try to use simplexml_load_string to load the clean XML. When we * try to print_r it should look something like below. SimpleXMLElement Object ( [@attributes] => Array ( [orderno] => 6 [campaign_name] => International Relief & Development for under developed nations ) [invalid-data] => Some other data containing & in it [unclosed-tag] => SimpleXMLElement Object ( ) ) */ $simpleXmlElement = simplexml_load_string($tidy); print_r($simpleXmlElement);
O desenvolvedor deve tentar comparar o XML inválido com um XML válido (gerado pelo tidy), para ver que não há efeitos colaterais adversos após o uso do tidy. O Tidy faz um trabalho extremamente bom em fazer isso corretamente, mas nunca é demais ver visualmente e ter 100% de certeza. Em nosso caso, deve ser tão simples quanto comparar $ xml com $ tidy.
fonte
O XML é inválido.
CDATA deve envolver todos os caracteres XML especiais, de acordo com W3C
fonte
Isso se deve a personagens que estão mexendo com os dados. Usar
htmlentities($yourText)
funcionou para mim (eu tinha o código html dentro do documento xml). Consulte http://uk3.php.net/htmlentities .fonte
Isso resolve meu problema:
$description = strip_tags($value['Description']); $description=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $description); $description= preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $description); $description=str_replace(' & ', ' & ', html_entity_decode((htmlspecialchars_decode($description))));
fonte
Se você está tendo esse problema com o openart, tente editar
fonte