Frage

Lassen Sie uns sagen, ich habe einige XML wie folgt

<channel>
  <item>
    <title>This is title 1</title>
  </item>
</channel>

Der folgende Code tut, was ich in möchten, dass sie den Titel als String ausgibt

$xml = simplexml_load_string($xmlstring);
echo $xml->channel->item->title;

Hier ist mein Problem. Der folgende Code behandelt nicht den Titel als String in diesem Zusammenhang so dass ich mit einem SimpleXML Objekt im Array anstelle einer Zeichenfolge enden.

$foo = array( $xml->channel->item->title );

Ich habe wie diese um es arbeitet

$foo = array( sprintf("%s",$xml->channel->item->title) );

, aber das scheint hässlich.

Was ist der beste Weg, um ein SimpleXML Objekt in eine Zeichenfolge zu erzwingen, unabhängig vom Kontext?

War es hilfreich?

Lösung

Typecast die SimpleXMLObject in einen String:

$foo = array( (string) $xml->channel->item->title );

Der obige Code ruft intern __toString() auf dem SimpleXMLObject. Dieses Verfahren ist nicht öffentlich zugänglich, da sie mit dem Zuordnungsschema des SimpleXMLObject stören, aber es kann immer noch in der oben beschriebenen Weise aufgerufen werden.

Andere Tipps

Sie können die PHP-Funktion verwenden

strval();

Diese Funktion gibt die Zeichenfolgenwerte des Parameters an sie übergeben.

Es stammt SimpleXML Methode SimpleXMLElement :: asXML Je nach Parametern schreibt es SimpleXMLElement in XML 1.0-Datei oder einfach nur in einen String:

$xml = new SimpleXMLElement($string);
$validfilename = '/temp/mylist.xml';
$xml->asXML($validfilename);    // to a file
echo $xml->asXML();             // to a string

Eine andere hässliche Art und Weise, es zu tun:

$foo = array( $xml->channel->item->title."" );

Es funktioniert, aber es ist nicht schön.

Um XML-Daten in einen PHP-Array erhalten Sie dies tun:

// this gets all the outer levels into an associative php array
$header = array();
foreach($xml->children() as $child)
{
  $header[$child->getName()] = sprintf("%s", $child); 
}
echo "<pre>\n";
print_r($header);
echo "</pre>";

Um ein Childs Kind zu bekommen dann nur dies zu tun:

$data = array();
foreach($xml->data->children() as $child)
{
  $header[$child->getName()] = sprintf("%s", $child); 
}
echo "<pre>\n";
print_r($data);
echo "</pre>";

Sie können $ xml-> durch die einzelnen Level erweitern, bis Sie bekommen, was Sie wollen Sie können auch ohne die Ebenen alle Knoten in einem Array setzen oder fast jede andere Art und Weise Sie es wollen.

Die akzeptierte Antwort gibt tatsächlich eine Reihe eine Zeichenfolge enthält, die nicht genau das, was OP angefordert (eine Zeichenkette). So erweitern Sie auf dieser Antwort verwenden:

$foo = [ (string) $xml->channel->item->title ][0];

, die das einzelne Element des Arrays zurückgibt, eine Zeichenfolge.

Versuchen strval ($ xml-> Channel-> item-> title)

Nicht sicher, ob sie die Sichtbarkeit der __toString() Methode geändert, seit der akzeptierte Antwort geschrieben wurde, aber zu dieser Zeit funktioniert es gut für mich:

var_dump($xml->channel->item->title->__toString());

OUTPUT:

string(15) "This is title 1"

Es stammt SimpleXML Methode SimpleXMLElement :: asXML Je nach Parameter schreibt SimpleXMLElement 1.0-Datei auf XML, Ja

$get_file= read file from path;
$itrate1=$get_file->node;
$html  = $itrate1->richcontent->html;


echo  $itrate1->richcontent->html->body->asXML();
 print_r((string) $itrate1->richcontent->html->body->asXML());

Das folgende ist eine rekursive Funktion, die alle Ein-Kind-Elemente zu einem String typisieren werden:

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FUNCTION - CLEAN SIMPLE XML OBJECT
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function cleanSimpleXML($xmlObject = ''){

    // LOOP CHILDREN
    foreach ($xmlObject->children() as $child) {

        // IF CONTAINS MULTIPLE CHILDREN
        if(count($child->children()) > 1 ){

            // RECURSE
            $child = cleanSimpleXML($child);

        }else{

            // CAST
            $child = (string)$child;

        }

    }

    // RETURN CLEAN OBJECT
    return $xmlObject;

} // END FUNCTION
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top