2011-09-29 47 views
67

Estoy leyendo un xml en php usando simplexml_load_file. Sin embargo al intentar cargar el código XML se muestra una lista de advertencias'xmlParseEntityRef: no name' advertencias al cargar xml en un archivo php

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 rectificar para eliminar estas advertencias?

(XML se genera a partir url http://..../index.php/site/projects & cargado en una variable en el prueba.php. No tengo privilegios de escritura en index.php)

+0

El XML no es válido. Es posible que no puedas cargarlo en absoluto. Los errores se pueden suprimir agregando '@' delante de 'simplexml_load_file' o agregando un marcador, consulte la página de manual de' simplexml_load_file' para obtener más información y elimine su pregunta, es un duplicado. – hakre

+0

Veo que mi respuesta está recibiendo bastante atención, si esa es realmente la solución: ¿puede marcarla como "respuesta correcta"? Gracias. – ricricucit

Respuesta

95

El XML es muy probablemente no válido.

El problema podría ser el "&"

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

se librará de la "&" y reemplazarlo con su versión de código HTML ... darle una oportunidad.

+1

Gracias. ¡Salvaste mi día! – Saim

+0

La mejor práctica al trabajar con XML es asegurarse de que no haya caracteres en conflicto y debe reemplazarlos antes de parsin –

+0

gracias, el punto principal de esta pregunta es porque xml no es válido – yussan

5

El XML no es válido.

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

CDATA debe ser envuelto alrededor de todos los caracteres XML especiales, como por W3C

54

encontrado este here ...

Problema: un analizador XML devuelve el error “xmlParseEntityRef: noname”

Causa: Hay un callejero '& '(carácter de ampersand) en algún lugar del texto XML, por ejemplo. un texto & algo más de texto

Solución:

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

Nota: ‘&’ ‘< ' '>‘será todo dar problemas si no se manejan correctamente.

+6

Esto me salvó hoy. – Bwire

+0

¿Sabemos por qué es esto? Además, ¿una sección de CDATA seguirá siendo recogida por un navegador que represente algunos de estos datos? Tengo algunas etiquetas HTML dentro de mis etiquetas XML y necesito que se muestren al usuario final para una herramienta de edición. – skeletalbassman

+0

@skeletalbassman La razón es parte de la respuesta. –

2

Esto es en realidad debido a los personajes que juguetean 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.

5

utilizar una versión combinada:

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

Este funciona a la perfección. Te estás perdiendo el corchete final que termina – myh34d

9

tratar de limpiar el código HTML en primer lugar utilizando esta función:

$html = htmlspecialchars($html); 

caracteres especiales suelen estar representados de manera diferente en HTML y puede ser confuso para el compilador . Como & se convierte en &amp;.

+0

¿Alguien puede explicar por qué esto es downvoted? 'htmlspecialchars()' es la función precisa para convertir '&," <, > 'caracteres en los datos del elemento – jacobross85

+0

Funcionó perfectamente para mí ... –

+0

porque la explicación no es clara y fácil de leer –

0

Esta resolver mi problème:

$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)))); 
4

PROBLEMA

  • función de PHP simplexml_load_file es tirar de error parser error : xmlParseEntityRef analizar al intentar cargar el archivo XML desde una dirección URL.

Causa

  • 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, deben asegurarse de que un XML válido se introduce en función PHP simplexml_load_file, pero parece que no tenemos ninguna control sobre cómo se crea el XML
  • Tampoco es posible forzar simplexml_load_file para procesar un archivo XML no válido . No nos deja muchas opciones distintas de que arreglan el archivo XML en sí.

SOLUCIÓN POSIBLE

Convertir XML no válido a XML válido. Se puede hacer usando PHP tidy extension. Puede 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 tratar de comparar el código XML no válido con un XML válido (generada por ordenado), al ver que no hay efectos secundarios adversos después de usar ordenado. 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.

0

Si usted está recibiendo este tema con opencart intentar editar

Catálogo/controlador/extensión/alimentación/google_sitemap.php para más información y cómo hacerlo consulte la siguiente: xmlparseentityref-no-name-error

Cuestiones relacionadas