tutorial simplexmlelement print new ejemplo create array php xml simplexml

simplexmlelement - simplexml php tutorial



Advertencias ''xmlParseEntityRef: no name'' al cargar xml en un archivo php (9)

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 url http://..../index.php/site/projects y se carga en una variable en test.php. No tengo privilegios de escritura en index.php)


PROBLEMA

  • La función PHP simplexml_load_file está arrojando un error al analizar el parser error : xmlParseEntityRef al intentar cargar el archivo XML desde una URL.

PORQUE

  • El XML devuelto por la URL no es un XML válido. Contiene & valor en lugar de &amp; . Es muy posible que haya otros errores que no son obvios en este momento.

COSAS FUERA DE NUESTRO CONTROL

  • Idealmente, deberíamos asegurarnos de que un XML válido se alimente en la función PHP simplexml_load_file , pero parece que no tenemos ningún control sobre cómo se crea el XML.
  • Tampoco es posible obligar a simplexml_load_file a procesar un archivo XML no válido. No nos deja muchas opciones, aparte de arreglar el archivo XML en sí.

SOLUCIÓN POSIBLE

Convierte XML inválido a XML válido. Se puede hacer usando PHP tidy extension . Se pueden encontrar más instrucciones en http://php.net/manual/en/book.tidy.php

Una 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 &amp; Development for under developed nations"> <invalid-data>Some other data containing &amp; 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);

PRECAUCIÓN

El desarrollador debe intentar comparar el XML no válido con un XML válido (generado por tidy), para ver que no haya efectos secundarios adversos después de usar tidy. Tidy hace un muy buen trabajo al hacerlo correctamente, pero nunca está de más verlo visualmente y estar 100% seguro. En nuestro caso, debería ser tan simple como comparar $ xml con $ tidy.


El XML no es válido.

<![CDATA[ {INVALID XML} ]]>

CDATA debe ser envuelto alrededor de todos los caracteres XML especiales, según W3C


El XML probablemente no es válido.

El problema podría ser el "&"

$text=preg_replace(''/&(?!#?[a-z0-9]+;)/'', ''&amp;'', $text);

eliminará el "&" y lo reemplazará con su versión de código HTML ... pruébelo.


Encontré esto aquí ...

Problema: Un analizador XML devuelve el error "xmlParseEntityRef: noname"

Causa: hay un ''&'' (personaje comercial) en el texto XML, por ejemplo. algo de texto y algo más de texto

Solución:

  • Solución 1: Retire el ampersand.
  • Solución 2: Codifique el signo comercial (es decir, reemplace el carácter ''&'' con ''& amp;''). Recuerde decodificar al leer el texto XML.
  • Solución 3: Use secciones CDATA (el analizador ignorará el texto dentro de una sección CDATA). Ej. <! [CDATA [texto y más texto]]>

Nota: ''&'' ''<''>> dará problemas si no se maneja correctamente.


Esto resuelve mi problema:

$description = strip_tags($value[''Description'']); $description=preg_replace(''/&(?!#?[a-z0-9]+;)/'', ''&amp;'', $description); $description= preg_replace("/(^[/r/n]*|[/r/n]+)[/s/t]*[/r/n]+/", "/n", $description); $description=str_replace('' & '', '' &amp; '', html_entity_decode((htmlspecialchars_decode($description))));


Esto se debe a que los personajes están jugando con los datos. Usar htmlentities($yourText) funcionó para mí (tenía un código html dentro del documento xml). Ver http://uk3.php.net/htmlentities .


Intenta limpiar el HTML primero usando esta función:

$html = htmlspecialchars($html);

Los caracteres especiales generalmente se representan de forma diferente en HTML y puede ser confuso para el compilador. Me gusta & convierte en &amp; .


Si está recibiendo este problema con Opencart intente editar

catalog / controller / extension / feed / google_sitemap.php Para obtener más información y cómo hacerlo, consulte esto: xmlparseentityref-no-name-error


Yo uso una versión combinada:

strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&amp;",$textorhtml))