79

このような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 オブジェクトを強制的に文字列にする最良の方法は何ですか?

4

11 に答える 11

153

SimpleXMLObject を文字列に型キャストします。

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

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

于 2009-01-06T14:01:58.430 に答える
22

PHP関数を使用できます

strval();

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

于 2009-02-04T20:06:57.537 に答える
9

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

$xml = new SimpleXMLElement($string);
$validfilename = '/temp/mylist.xml';
$xml->asXML($validfilename);    // to a file
echo $xml->asXML();             // to a string
于 2013-02-01T06:03:03.433 に答える
3

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

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

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

于 2016-09-07T16:24:21.027 に答える
3

それを行う別の醜い方法:

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

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

于 2012-08-13T08:25:25.743 に答える
2

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つの配列に配置することもできます。

于 2011-07-11T21:27:17.870 に答える