0

次のxmlドキュメントがあります。

<shop id="123" name="xxx">
  <product id="123456">
    <name>Book</name>
    <price>9.99</price
  </product>
  <product id="789012">
    <name>Perfume</name>
    <price>12.99</price
  </product>
  <product id="345678">
    <name>T-Shirt</name>
    <price>9.99</price
  </product>
</shop>
<shop id="456" name="yyy">
  <product id="123456">
    <name>Book</name>
    <price>9.99</price
  </product>
</shop>

各製品の情報を収集するために、次のループがあります。

$data_feed = 'www.mydomain.com/xml/compression/gzip/';
$xml = simplexml_load_file("compress.zlib://$data_feed");

        foreach ($xml->xpath('//product') as $row) {
                        $id = $row["id"]; // product id eg. "123456"
                        $name = $row->name;
                        $price = $row->price;

        // update database etc.
        }

ただし、各商品の親ショップ (「id」と「name」) の情報も収集したいと考えています。

製品ではなくショップから開始するように xpath を簡単に変更できますが、インデントされた各製品をループするために foreach 内に追加のループを構築する最も効率的な方法がわかりません

わかる?

4

2 に答える 2

1

xpath入れ子になった 2 つのループを使用foreachせずに、次のように使用します。

$xml = simplexml_load_string($x); // assume XML in $x

foreach ($xml->shop as $shop) {
    echo "shop $shop[name], id $shop[id] <br />";
    foreach ($shop->product as $product) {
        echo "- $product->name (id $product[id]), $product->price <br />";
    }
}

動作を確認してください: http://codepad.viper-7.com/vFmGvY

ところで: あなたの XML は壊れています。おそらくタイプミスです。各締めくくり</price>には、最後の がありません>

于 2013-10-25T23:21:34.647 に答える
0

確かに、反復のネストされた製品ではなく、1つの反復が必要です(それはあなたをあまりカットしませんが、@michiはすでに示しました)。これも可能です:

foreach ($xml->xpath('//product') as $row) 
{
    $id       = $row["id"]; // product id eg. "123456"
    $name     = $row->name;
    $price    = $row->price;
    $shopId   = $row->xpath('../@id')[0];
    $shopName = $row->xpath('../@name')[0];

    // update database etc.
}

この例が示すように、各 element-node で実行できxpath()、context-node はノード自体に自動的に設定されるため、..xpath の実際のパスは親要素にアクセスするために機能します (「PHP の SimpleXML を使用して要素の親にアクセスする」も参照)。 ? )。次に、両方の属性が読み取られ、PHP 5.4 配列を介して最初の (そして唯一の) 属性が参照解除されます。

これが役に立ち、それがどのように機能するかを明らかにすることを願っています。あなたの質問は、私がこれらの種類の問題に対するある種の一般的な解決策を提案した以前の質問を少し思い出させます:

于 2013-10-26T21:29:21.260 に答える