web-dev-qa-db-ja.com

コンテキストに関係なく、SimpleXMLオブジェクトを文字列に強制する

私はこのようなXMLを持っているとしましょう

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

以下のコードは、タイトルを文字列として出力するという点で私が望むことをします

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

これが私の問題です。以下のコードは、そのコンテキストではタイトルを文字列として扱わないため、文字列ではなく配列内のSimpleXMLオブジェクトになります。

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

私はこのようにそれを回避してきました

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

しかし、それはいようです。

コンテキストに関係なく、SimpleXMLオブジェクトを文字列に強制する最良の方法は何ですか?

72
Mark Biek

SimpleXMLObjectを文字列に型キャストする

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

上記のコードは、SimpleXMLObjectで__toString()を内部的に呼び出します。このメソッドはSimpleXMLObjectのマッピングスキームに干渉するため、公開されていませんが、上記の方法で呼び出すことができます。

141
Aron Rotteveel

PHP関数を使用できます

strval();

この関数は、渡されたパラメーターの文字列値を返します。

20
Zaje

ネイティブSimpleXMLメソッドがあります SimpleXMLElement :: asXML パラメーターに応じて、SimpleXMLElementをxml 1.0ファイルまたは単に文字列に書き込みます。

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

別の見苦しい方法:

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

それは動作しますが、きれいではありません。

3
Mikepote

受け入れられた答えは、実際には、OPが要求したもの(文字列)ではない文字列を含む配列を返します。その答えを拡張するには、次を使用します。

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

配列の単一の要素である文字列を返します。

2
DJ Far

XMLデータをphp配列に取得するには、次のようにします。

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

子の子を取得するには、次のようにします。

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

必要なものが得られるまで、各レベルで$ xml->を展開できます。また、レベルなしで、または他の方法ですべてのノードを1つの配列に配置することもできます。

1
Pete

Strval($ xml-> channel-> item-> title)を試してください

1
Ariel Ruiz

ネイティブSimpleXMLメソッドSimpleXMLElement :: asXMLがあります。パラメーターに応じて、SimpleXMLElementをxml 1.0ファイルに書き込みます。はい

$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

受け入れられた答えが書かれたので、彼らが__toString()メソッドの可視性を変更したかどうかはわかりませんが、この時点ではうまくいきます:

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

出力:

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