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.
¿Están realmente convertidos, o está viendo la salida en un navegador? Mira la fuente de la página si ... –
Se convierten. – danidacar
Ejecutando su código, veo '# &62;' que sale como '<'. –