2012-02-29 9 views
7

tengo este código:XML sin tener que reemplazar las entidades HTML en PHP

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
$strXml = ' 
<root> 
<kid><div>ABC&#8226;&#62;</div></kid> 
<kid2>DEF</kid2> 
</root>'; 

$objXml = new SimpleXMLElement($strXml); 
$arrNodes = $objXml->xpath('/root/*'); 
foreach($arrNodes as $objNode) { 
    /* @var $objNode SimpleXMLElement */ 
    echo $objNode->asXML(); 
} 

El código extrae los primeros hijos de la raíz y muestra el contenido. El problema es que las entidades html se convierten en caracteres. ¿Hay alguna forma en que el código muestre el contenido XML inicial sin ninguna conversión?

+0

¿Están realmente convertidos, o está viendo la salida en un navegador? Mira la fuente de la página si ... –

+0

Se convierten. – danidacar

+0

Ejecutando su código, veo '# &62;' que sale como '<'. –

Respuesta

1

¿Hay alguna forma en que el código muestre el contenido XML inicial sin ninguna conversión?

Aparte: ¿Por qué te importa? Ellos son el mismo personaje.

+0

A usted le importa si tiene un cliente que desea el mismo resultado al final, incluso si técnicamente es lo mismo. – danidacar

+0

Realmente no lo haría, pero así soy yo. De cualquier manera, tienes tu respuesta. :) – salathe

0

SimpleXML/DOMDocument/etc siempre convertirá estas entidades ya que las entidades numeradas no son XML válidos.

Así que o bien:

  • búsqueda épica y reemplazar.
  • ¿O quizás arreglar lo que está generando el XML?
+0

Las entidades numéricas son válidas en XML. – danidacar

+0

Según SimpleXML, etc., no es ... técnicamente correcto ... http://www.w3.org/TR/REC-xml/#charsets – Ing

+0

@IngmarBoddington puede encontrar informes de fallos o discusiones sobre este tema ? Parece un comportamiento realmente extraño para mí y no puedo encontrar nada al respecto. Parece afectar * a todas * las diversas cosas de PHP XML (que yo sepa). –

0

Esto me parece un comportamiento realmente extraño, y no estoy teniendo suerte buscando información.

Parece afectar a todos los relevantes XML stuff. Es también digno de mención que los caracteres se almacenan como personajes regulares una vez que se analiza el XML:

php > print_r($objXml); 
SimpleXMLElement Object 
(
    [kid] => SimpleXMLElement Object 
     (
      [div] => ABC•> 
     ) 

    [kid2] => DEF 
) 

... Están escritos como entidades cuando el XML se convierte en texto. Supongo que todo está usando la misma rutina interna para convertir a texto.

Si realmente necesita esta función, puede crear su propia función para escapar de los personajes, algo como esto:

// function to escape some utf8 characters with xml character reference 
function xmlCharEncode($string) { 

    $out = ''; 

    $len = mb_strlen($string, 'UTF-8'); 

    for ($i = 0; $i < $len; $i++) { 

    $char = mb_substr($string, $i, 1, 'UTF-8'); 

    $convmap = array(
     60, 60, 0, 0xffff, // < 
     62, 62, 0, 0xffff, // > 
     38, 38, 0, 0xffff, // ampersand 
     // you may want to filter quotes or other characters here 
     127, 0xffff, 0, 0xffff, // everything after basic latin 
    ); 

    $enc = mb_encode_numericentity($char, $convmap, 'UTF-8'); 

    $out .= $enc; 

    } 

    return $out; 

} 

... y luego usar XMLReader y XMLWriter para escribir el código XML usando su carácter personalizado escapar de la rutina:

// read and write your xml string 

$r = new XMLReader(); 
$w = new XMLWriter(); 
$r->xml($strXml); 
$w->openMemory(); 

while($r->read()) { 

    switch ($r->nodeType) { 

    // write elements, attributes, and text nodes 

    case XMLReader::ELEMENT: 
     $w->startElement($r->name); 
     while ($r->moveToNextAttribute()) { 
     echo $w->outputMemory(true); 
     $w->writeAttribute($r->name, $r->value); 
     } 
     break; 

    case XMLReader::END_ELEMENT: 
     $w->endElement(); 
     break; 

    case XMLReader::TEXT: 
     $w->writeRaw(xmlCharEncode($r->value)); // the magic happens here 
     break; 

    } 

    echo $w->outputMemory(true); 

} 

no estoy realmente convencido de que esto vale la pena, pero al menos tener una idea de qué tipo de cosas se puede hacer para conseguir este trabajo.

Esto funcionará con su ejemplo original, por cierto.

Cuestiones relacionadas