0

私はいくつかのxmlを持っています。これは単純なバージョンです。

<xml>
<items>
  <item abc="123">item one</item>
  <item abc="456">item two</item>
</items>
</xml>

コンテンツに SimpleXML を使用し、

 $obj = simplexml_load_string( $xml );

@属性を使用$obj->xpath( '//items/item' );してアクセスできます。

配列の結果が必要なので、json_decode(json_encode($obj),true)トリックを試してみましたが、@attributes (つまり、abc="123") へのアクセスが削除されているようです。

属性へのアクセスを提供し、配列を残す別の方法はありますか?

4

5 に答える 5

2

attributes() 関数を呼び出す必要があります。

サンプルコード:

$xmlString = '<xml>
<items>
  <item abc="123">item one</item>
  <item abc="456">item two</item>
</items>
</xml>';

$xml = new SimpleXMLElement($xmlString);

foreach( $xml->items->item as $value){
$my_array[] =  strval($value->attributes());
}

print_r($my_array);

評価

于 2013-08-31T15:17:50.207 に答える
1

あなたはルートに行くことができjson_encodejson_decodeそしてあなたが欠けているものを追加することができます。なぜなら、そのjson_encode-ingはSimpleXMLElement.

ルールとその詳細に興味がある場合は、それに関する 2 つのブログ記事を書きました。

おそらくもっと興味深いのは、json シリアライゼーションを変更して独自の形式を提供する方法を示す 3 番目の部分です (たとえば、属性を保持するため)。

本格的な例が付属しています。コードの抜粋を次に示します。

$xml = '<xml>
<items>
  <item abc="123">item one</item>
  <item abc="456">item two</item>
</items>
</xml>';

$obj = simplexml_load_string($xml, 'JsonXMLElement');

echo $json = json_encode($obj, JSON_PRETTY_PRINT), "\n";

print_r(json_decode($json, TRUE));

JSON と配列の出力は次のとおりです。属性はその一部であることに注意してください。

{
    "items": {
        "item": [
            {
                "@attributes": {
                    "abc": "123"
                },
                "@text": "item one"
            },
            {
                "@attributes": {
                    "abc": "456"
                },
                "@text": "item two"
            }
        ]
    }
}
Array
(
    [items] => Array
        (
            [item] => Array
                (
                    [0] => Array
                        (
                            [@attributes] => Array
                                (
                                    [abc] => 123
                                )

                            [@text] => item one
                        )

                    [1] => Array
                        (
                            [@attributes] => Array
                                (
                                    [abc] => 456
                                )

                            [@text] => item two
                        )

                )

        )

)
于 2013-08-31T22:50:12.403 に答える