Erzwingen ein SimpleXML Objekt in einen String, unabhängig vom Kontext
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?
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