2012-02-29 9 views
7

ho questo codice:ottenere i bambini XML senza sostituire entità HTML in 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(); 
} 

Il codice estrae i primi figli della radice e visualizza il contenuto. Il problema è che le entità html vengono convertite in caratteri. È possibile che il codice restituisca il contenuto XML iniziale senza alcuna conversione?

+0

Sono davvero convertiti o stai visualizzando l'output in un browser? Guarda la fonte della pagina se sei ... –

+0

Sono convertiti. – danidacar

+0

Eseguendo il codice, vedo '# &62;' viene emesso come '<'. –

risposta

1

È possibile che il codice restituisca il contenuto XML iniziale senza alcuna conversione?

No.

parte: Perché ti interessa? Sono lo stesso personaggio.

+0

Ti importa se hai un cliente che desidera lo stesso output alla fine, anche se tecnicamente è lo stesso. – danidacar

+0

Davvero non lo farei, ma sono solo io. In ogni caso hai la tua risposta. :) – salathe

0

SimpleXML/DOMDocument/etc converte sempre queste entità in quanto le entità numerate non sono XML validi.

Quindi, o:

  • ricerca epica e sostituire.
  • O forse risolvere qualunque cosa stia generando l'XML?
+0

Le entità numeriche sono valide in XML. – danidacar

+0

Secondo SimpleXML ecc non è ... sei tecnicamente corretto però ... http://www.w3.org/TR/REC-xml/#charsets – Ing

+0

@IngmarBoddington puoi trovare segnalazioni di bug o discussioni su questo ? Sembra un comportamento davvero strano per me e non riesco a trovare molto a riguardo. Sembra influenzare * tutti * i vari file XML di PHP (che io conosca). –

0

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.

Problemi correlati