Bağlamdan bağımsız, bir dizeye bir SimpleXML nesne zorlamak

4 Cevap php

Diyelim ki, bu gibi bazı XML var diyelim

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

Aşağıdaki kod ben bir dize olarak unvanını verir ki ne istediğinizi yapar

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

İşte benim sorunum. Aşağıdaki kod bu yüzden yerine bir dize dizideki bir SimpleXML nesne ile sonuna kadar bu bağlamda bir dize olarak unvanını tedavi etmez.

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

Ben böyle etrafında çalışıyoruz

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

ama o çirkin görünüyor.

What's the best way to force a SimpleXML object to a string, regardless of context?

4 Cevap

Typecast the SimpleXMLObject to a string:

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

Yukarıdaki kod dahili SimpleXMLObject üzerine __toString() çağırır. Bu SimpleXMLObject haritalama düzeni ile müdahale gibi bu yöntem, kamuya açık değil, ama yine yukarıdaki şekilde çağrılabilir.

Sen PHP fonksiyonunu kullanabilirsiniz

strval();

Bu fonksiyon, kendisine geçirilen parametre dize değerlerini döndürür.

Bunu bir php diziye XML verilerini almak için:

// 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>";

Bir oğul çocuk almak için o zaman sadece bunu:

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

You can expand $xml-> through each level until you get what you want You can also put all the nodes into one array without the levels or just about any other way you want it.

Bunu yapmak için başka bir çirkin yolu:

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

Bu çalışır, ama güzel değil.