2011-05-15 12 views
5

Estoy usando DOMDocument y DOMXPath en PHP para encontrar elementos en un documento HTML. Este documento contiene entidades HTML como & nbsp; y me gustaría que estas entidades se conservaran en la salida XPath.¿Cómo evitar que DOMXPath expanda entidades HTML?

$doc = new DOMDocument(); 
$doc->loadHTML('<html><head></head><body>&nbsp;Test</body></html>'); 

$xpath = new DOMXPath($doc); 
$nodes = $xpath->query('//body'); 

foreach($nodes as $node) { 
    echo $node->textContent; 
} 

Este código produce la siguiente salida (UTF-8):

[space]Test 

Pero me gustaría tener esto:

&nbsp;Test 

Tal vez tenga algo que ver con LibXML que PHP lo usa internamente, pero no pude encontrar ninguna función que preserve las entidades HTML.

¿Tienes una idea?

+2

'[space]' no es UTF-8. ¿Estás seguro de que es U + 0020 y no U + 00A0? – Alohci

+0

@Alohci: Sí, tienes razón, es U + 00A0. Solo quería dejar en claro que la salida se muestra con espacios en blanco en lugar de la entidad nbsp. – chrisklaussner

+0

@Dimitre: Lo siento, pero esta es una pregunta específica de XPath. Se trata de la salida de una consulta XPath. – chrisklaussner

Respuesta

4

XPath siempre ve una representación del documento XML en el que las referencias de entidades se han expandido. La única forma de evitar esto es preprocesar el documento XML, reemplazando las referencias de entidad por algo que no se expandirá, por ejemplo, cambiando &nbsp; a §nbsp;.

2

Un procesador XPath no sabe si se ha especificado un espacio no frenado como &nbsp; o &#xA0;' -- the character is always provided to it as a character entity -- & # 160`.

+0

No creo que esta respuesta sea correcta. Un procesador XPath no opera en Infoset, opera en el modelo de datos XPath (XDM), que se define en términos del Infoset. Infoset permite la presencia de elementos de información de referencia de entidad sin expandir. XDM no. Por lo tanto, es de hecho un problema XPath. –

+0

@Michael Kay: Gracias por esta corrección. –

Cuestiones relacionadas