4

アプリケーションの関数は次のことを行います。

  • Snoopy を使用して Web ページをキャプチャする
  • 結果を DOMDocument にロードする
  • DOMDocument を単純な XML オブジェクトにロードする
  • XPath を実行して、必要なドキュメントのセクションを分離します
  • 結果を json_encode し、後で使用するためにデータベースに保存します。

このブロックをデータベースから復元してデコードするときに問題が発生します。オブジェクトを var_dump すると @attributes が表示されますが、それらにアクセスできるコマンドの組み合わせが見つかりません。

エラー メッセージ: 致命的なエラー: タイプ stdClass のオブジェクトを配列として使用できません

以下は私のオブジェクトのサンプルです。とりわけ、以前は機能していたものを試しました。

echo $obj['class'];

stdClass Object
(
    [@attributes] => stdClass Object
        (
            [class] => race_idx_hdr
        )

    [img] => stdClass Object
        (
            [@attributes] => stdClass Object
                (
                    [src] => /Images/Icons/i_blue_bullet.gif
                    [alt] => image
                    [title] => United Kingdom
                )

        )

    [a] => Fast Cards
)
4

3 に答える 3

3

私は実際にあなたが何をしようとしているのか、どこでエラーがスローされているのかをよく理解していませんが、使用できるオブジェクトのプロパティにアクセスするには

echo $obj->{'@attributes'}->class; // prints "race_idx_hdr"
echo $obj->img->{'@attributes'}->src; // prints "/Images/Icons/i_blue_bullet.gif"
echo $obj->img->{'@attributes'}->alt; // prints "image"
echo $obj->img->{'@attributes'}->title; // prints "United Kingdom"
echo $obj->a; // prints "Fast Cards"

-symbol は PHP で予約されており、識別子には使用できないため、この奇妙な構文 ( $obj->{'@attributes'}) が必要です。@

于 2009-10-01T17:10:50.763 に答える
2

データベースから json をデコードすると、SimpleXMLElement::xpath 関数によって返される元の型「SimpleXMLElement」ではなく、型「stdClass」のオブジェクトが取得されます。

stdClass オブジェクトは、SimpleXMLElement オブジェクトが属性へのアクセスを許可するために使用する疑似配列構文について「認識」していません。

通常、オブジェクトをデータベースに格納するには、json_encode/decode の代わりに serialize() および unserialize() 関数を使用しますが、残念ながら、SimpleXMLElements はそれらで動作しません。

別の方法として、実際の xml を保存し、データベースから取得した後に SimpleXML に読み戻してはどうでしょうか。

// convert SimpleXMLElement back to plain xml string
$xml = $simpleXML->asXML();

// ... code to store $xml in the database
// ... code to retrieve $xml from database

// recreate SimpleXMLELement
$simpleXML = simplexml_load_string($xml);
于 2009-10-01T17:24:46.600 に答える
0

オブジェクトが配列に変換される場合、結果は要素がオブジェクトのプロパティである配列になります。

$asArray = (array)$myObj;
echo $asArray['@attribute'];
于 2009-10-01T17:10:03.727 に答える