Questo mi sembra un comportamento davvero strano, e non ho alcuna fortuna a cercare informazioni.
Sembra interessare tutto il relativo XML stuff. E 'anche interessante notare che i caratteri vengono memorizzati come personaggi regolari una volta che l'XML viene analizzato:
php > print_r($objXml);
SimpleXMLElement Object
(
[kid] => SimpleXMLElement Object
(
[div] => ABC•>
)
[kid2] => DEF
)
... Sono scritte come entità quando l'XML viene convertito in testo. Immagino che tutto stia usando la stessa routine interna per convertire in testo.
Se davvero bisogno di questa funzionalità, è possibile creare la propria funzione per sfuggire ai personaggi, qualcosa di simile:
// 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;
}
... e poi usare XMLReader e XMLWriter di scrivere il codice XML utilizzando il tuo personaggio personalizzato fuga di routine:
// 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);
}
io non sono davvero convinto che questo vale la pena, ma almeno si ha un'idea di che tipo di cose può essere fatto per ottenere questo lavoro.
Questo funzionerà con il tuo esempio originale, a proposito.
Sono davvero convertiti o stai visualizzando l'output in un browser? Guarda la fonte della pagina se sei ... –
Sono convertiti. – danidacar
Eseguendo il codice, vedo '# &62;' viene emesso come '<'. –