Estoy leyendo un xml en php usando simplexml_load_file
. Sin embargo, al intentar cargar el xml, muestra una lista de advertencias
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
¿Cómo rectifico para eliminar estas advertencias?
(XML se genera a partir de la url http://..../index.php/site/projects
y se carga en una variable en test.php. No tengo privilegios de escritura en index.php)
@
delantesimplexml_load_file
o agregando una bandera, consulte la página del manual desimplexml_load_file
para obtener más información y elimine su pregunta, es un duplicado.Respuestas:
Lo más probable es que el XML no sea válido.
El problema podría ser el "&"
$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text);
eliminará el "&" y lo reemplazará con su versión de código HTML ... pruébelo.
fuente
$text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&', $text);
Encontré esto aquí ...
fuente
Intente limpiar el HTML primero usando esta función:
$html = htmlspecialchars($html);
Los caracteres especiales generalmente se representan de manera diferente en HTML y pueden resultar confusos para el compilador. Como se
&
convierte&
.fuente
htmlspecialchars()
es la función precisa para convertir&, ", <, >
caracteres en los datos del elemento.htmlspecialchars()
y no romper XML. Probé algunas banderas y mi XML todavía se rompió.htmlspecialchars
en el contenido de una etiqueta xml, no en todo el XMLYo uso una versión combinada:
strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&",$textorhtml))
fuente
simplexml_load_file
arroja un error de análisisparser error : xmlParseEntityRef
al intentar cargar el archivo XML desde una URL.&
valor en lugar de&
. Es muy posible que haya otros errores que no son obvios en este momento.simplexml_load_file
función , pero parece que no tenemos ningún control sobre cómo se crea el XML.simplexml_load_file
procesamiento de un archivo XML no válido. No nos deja muchas opciones, aparte de arreglar el archivo XML en sí.Convierta XML no válido en XML válido. Se puede hacer usando
PHP tidy extension
. Se pueden encontrar más instrucciones en http://php.net/manual/en/book.tidy.phpUna vez que esté seguro de que la extensión existe o está instalada, haga lo siguiente.
/** * 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);
El desarrollador debe intentar comparar el XML no válido con un XML válido (generado por tidy), para ver que no hay efectos secundarios adversos después de usar tidy. Tidy hace un excelente trabajo haciéndolo correctamente, pero nunca está de más verlo visualmente y estar 100% seguro. En nuestro caso debería ser tan sencillo como comparar $ xml con $ tidy.
fuente
El XML no es válido.
CDATA debe estar envuelto alrededor de todos los caracteres XML especiales, según W3C
fuente
Esto se debe a que los personajes están jugando con los datos. El uso
htmlentities($yourText)
funcionó para mí (tenía código html dentro del documento xml). Consulte http://uk3.php.net/htmlentities .fuente
Esto resuelve mi 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))));
fuente
Si tiene este problema con opencart, intente editar
fuente