コンテキストに関係なく、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オブジェクトを文字列に強制する最良の方法は何ですか?
解決
SimpleXMLObjectを文字列に型キャストします:
$foo = array( (string) $xml->channel->item->title );
上記のコードは、SimpleXMLObjectで __ toString()
を内部的に呼び出します。このメソッドはSimpleXMLObjectのマッピングスキームに干渉するため、公開されていませんが、上記の方法で呼び出すことができます。
他のヒント
PHP関数を使用できます
strval();
この関数は、渡されたパラメーターの文字列値を返します。
ネイティブの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
別の見苦しい方法:
$foo = array( $xml->channel->item->title."" );
動作しますが、きれいではありません。
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-&gt;を展開できます。あなたが望むものを手に入れるまで、各レベルを通して レベルなしですべてのノードを1つの配列に配置することもできます。 あなたがそれを望む他の方法について。
受け入れられた回答は、実際には文字列を含む配列を返します。これは、OPが正確に要求したものではありません(文字列)。 その答えを展開するには、次を使用します。
$foo = [ (string) $xml->channel->item->title ][0];
配列の単一の要素である文字列を返します。
strval($ xml-&gt; channel-&gt; item-&gt; title)を試してください
受け入れられた回答が書かれたので、彼らが __ toString()
メソッドの可視性を変更したかどうかはわかりませんが、現時点ではうまくいきます:
var_dump($xml->channel->item->title->__toString());
出力:
string(15) "This is title 1"
SimpleXMLElementネイティブメソッド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());
以下は、すべての単一子要素を 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