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

StackOverflow https://stackoverflow.com/questions/416548

  •  03-07-2019
  •  | 
  •  

質問

このような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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top