Angenommen, ich habe XML wie dieses
<channel>
<item>
<title>This is title 1</title>
</item>
</channel>
Der folgende Code macht das, was ich will, indem er den Titel als Zeichenfolge ausgibt
$xml = simplexml_load_string($xmlstring);
echo $xml->channel->item->title;
Hier ist mein Problem. Der folgende Code behandelt den Titel in diesem Kontext nicht als Zeichenfolge, sodass ich am Ende ein SimpleXML-Objekt im Array anstelle einer Zeichenfolge habe.
$foo = array( $xml->channel->item->title );
Ich habe so daran gearbeitet
$foo = array( sprintf("%s",$xml->channel->item->title) );
aber das scheint hässlich.
Was ist der beste Weg, um ein SimpleXML-Objekt unabhängig vom Kontext in eine Zeichenfolge zu zwingen?
Antworten:
Geben Sie das SimpleXMLObject in eine Zeichenfolge ein:
$foo = array( (string) $xml->channel->item->title );
Der obige Code ruft
__toString()
das SimpleXMLObject intern auf. Diese Methode ist nicht öffentlich verfügbar, da sie das Zuordnungsschema des SimpleXMLObject stört, kann jedoch auf die oben beschriebene Weise aufgerufen werden.quelle
substr
et al. Arbeiten. Es ist jedoch sicherer, die Besetzung so früh wie möglich durchzuführen, damit Sie wissen, dass alle Funktionen die erwarteten Daten sehen.Sie können die PHP-Funktion verwenden
strval();
Diese Funktion gibt die Zeichenfolgenwerte des an sie übergebenen Parameters zurück.
quelle
__toString()
implementiert wurden, und insbesondere in diesem Fall funktioniert es sehr gut mit Objekten vom TypSimpleXMLElement
. Sie können es mit derstring
Besetzung in der akzeptierten Antwort vergleichen.strval()
ist eine praktische Rückruffunktion, die häufig in Verbindung mitarray_map()
unditerator_to_array($simpleXMLElement, false)
oder verwendet wirdSimpleXMLElement::xpath()
.Es gibt die native SimpleXML-Methode SimpleXMLElement :: asXML. Je nach Parameter schreibt SimpleXMLElement in eine XML 1.0-Datei oder nur in eine Zeichenfolge:
$xml = new SimpleXMLElement($string); $validfilename = '/temp/mylist.xml'; $xml->asXML($validfilename); // to a file echo $xml->asXML(); // to a string
quelle
Ein anderer hässlicher Weg, es zu tun:
$foo = array( $xml->channel->item->title."" );
Es funktioniert, aber es ist nicht schön.
quelle
Die akzeptierte Antwort gibt tatsächlich ein Array zurück, das eine Zeichenfolge enthält, die nicht genau dem entspricht, was OP angefordert hat (eine Zeichenfolge). Um diese Antwort zu erweitern, verwenden Sie:
$foo = [ (string) $xml->channel->item->title ][0];
Was das einzelne Element des Arrays zurückgibt, eine Zeichenfolge.
quelle
Um XML-Daten in ein PHP-Array zu bekommen, gehen Sie folgendermaßen vor:
// 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 Kind zu bekommen, gehen Sie einfach wie folgt vor:
$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 jede Ebene erweitern, bis Sie das erhalten, was Sie möchten. Sie können auch alle Knoten in einem Array ohne die Ebenen oder auf eine beliebige andere Weise zusammenfassen.
quelle
Versuchen Sie es mit strval ($ xml-> channel-> item-> title)
quelle
Ich bin mir nicht sicher, ob sie die Sichtbarkeit der
__toString()
Methode geändert haben , seit die akzeptierte Antwort geschrieben wurde, aber zu diesem Zeitpunkt funktioniert es gut für mich:AUSGABE:
string(15) "This is title 1"
quelle
Es gibt die native SimpleXML-Methode SimpleXMLElement :: asXML. Je nach Parameter schreibt SimpleXMLElement in die XML 1.0-Datei. 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());
quelle
Setzen Sie einfach das ''. Vor jeder Variablen wird sie in einen String konvertiert.
$ foo = array (''. $ xml-> channel-> item-> title);
quelle
Das Folgende ist eine rekursive Funktion, die alle untergeordneten Elemente in a typisiert
String
:////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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
quelle