it-swarm.dev

Vynucení objektu SimpleXML na řetězec bez ohledu na kontext

Řekněme, že mám takový XML

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

Níže uvedený kód dělá to, co chci v tom, že vystupuje jako řetězec

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

Tady je můj problém. Níže uvedený kód nezachází s názvem jako s řetězcem v tomto kontextu, takže jsem skončil s objektem SimpleXML v poli namísto řetězce.

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

Pracovala jsem takhle

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

ale to vypadá ošklivě.

Jaký je nejlepší způsob, jak přinutit objekt SimpleXML k řetězci bez ohledu na kontext?

72
Mark Biek

Zadejte příkaz SimpleXMLObject do řetězce:

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

Výše uvedený kód interně volá __toString() na SimpleXMLObject. Tato metoda není veřejně dostupná, protože interferuje s mapovacím schématem SimpleXMLObject, ale může být stále vyvolána výše uvedeným způsobem.

140
Aron Rotteveel

Můžete použít funkci PHP

strval();

Tato funkce vrací hodnoty řetězců předaných parametru.

20
Zaje

Existuje nativní metoda SimpleXML SimpleXMLElement :: asXML V závislosti na parametru zapíše soubor SimpleXMLElement do souboru XML 1.0 nebo jen na řetězec:

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

Další ošklivý způsob, jak to udělat:

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

Funguje to, ale není to hezké.

3
Mikepote

Chcete-li získat data XML do pole PHP, postupujte takto:

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

Chcete-li získat dítě dítěte, pak to udělejte takto:

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

Můžete rozšířit $ xml-> přes každou úroveň, dokud nedostanete to, co chcete.

2
Pete

Přijatá odpověď skutečně vrací pole obsahující řetězec, což není přesně to, co OP požadoval (řetězec). Chcete-li tuto odpověď rozšířit, použijte:

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

Vrátí jediný prvek pole, řetězec.

1
DJ Far

Vyzkoušejte strval ($ xml-> channel-> item-> title)

1
Ariel Ruiz

Tam je nativní SimpleXML metoda SimpleXMLElement :: asXML V závislosti na parametru zapíše soubor SimpleXMLElement do xml 1.0, Ano 

$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());
0
BAVA SHIEK BAREETH

Nejste si jisti, zda změnili viditelnost metody __toString(), protože přijatá odpověď byla napsána, ale v tomto okamžiku to funguje dobře:

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

VÝSTUP:

string(15) "This is title 1"
0
billynoah