1

私は SimpleXMLElement XPath アプローチと DOMDocument XPath アプローチの両方を試しましたが、どちらの方法でも物事をまっすぐにすることはできませんが、少なくとも SimpleXMLElement ルートを使用すると、実際に結果変数を出力して、何が起こっているかを確認できました。(以下の結果を参照)

結果をループせずに XPath クエリを使用したい。配列のように結果にアクセスしたいだけだと思いますが、問題はその結果配列内の SimpleXMLElement オブジェクトを通過しているようです。

特定のクラスの div で HTML スニペットをクエリしています。ただし、この特定のクラスにはいくつかの div があるため、それらすべてが返されますが、これは問題ありません。それが私が欲しいものです。しかし、今はそれぞれにアクセスして値を取得したいのですが、ほとんどの場合、子 div があるだけです。

XPath クエリを実行するために使用している行は次のとおりです。

$stats = $xml->xpath("//div[contains(@class,'line-item')]");

結果の print_r() 出力は次のとおりです。

// Output of $stats
Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [class] => line-item
                )
            [div] => Array
                (
                    [0] => Total items shipped
                    [1] => 50
                )
        )
    [1] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [class] => line-item-total
                )
            [div] => Array
                (
                    [0] => TOTAL EARNINGS *
                    [1] => $267.23
                )
        )
    [2] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [class] => line-item-links
                )
            [a] => View full report
        )
    [3] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [class] => line-item
                )
            [div] => Array
                (
                    [0] => Ordered items
                    [1] => 42
                )
        )
    [4] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [class] => line-item
                )
            [div] => Array
                (
                    [0] => Clicks
                    [1] => 428
                )

        )
    [5] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [class] => line-item
                )
            [div] => Array
                (
                    [0] => Conversion
                    [1] => 9.81%
                )
        )
    [6] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [class] => line-item-links
                )
            [a] => View full report
        )
)

さて、各値がどこにあるかを知っているので、次のようにアクセスできると思いました。

$y['clicks'] = "{$stats[4]['div'][0]}: {$stats[5]['div'][1]}\n";
$y['ordered'] = "{$stats[3]['div'][0]}: {$stats[4]['div'][1]}\n";
$y['shipped'] = "{$stats[0]['div'][0]}: {$stats[0]['div'][1]}\n";
$y['conversion'] = "{$stats[5]['div'][0]}: {$stats[6]['div'][1]}\n"; // Doesn't work
$y['rate'] = "{$stats[1]['div'][0]}: {$stats[4]['div'][1]}\n"; // Neither encased in {}
$y['total'] = 'Yesterday\'s Earnings: '.$stats[1]['div'][1]."\n"; // Nor as concatenated

明らかな問題は、SimpleXMLElement オブジェクトが $stats 配列と ['div'] 配列のアイテムの間に挟まれていることです。そのサブアイテムの値は、SimpleXMLElement オブジェクトの背後に隠れています。

では、$stats 配列をループせずに、SimpleXMLElement オブジェクトを超えてこれらの値を取得するにはどうすればよいでしょうか? 上記ですでに試したことに似たものはありますか?

4

2 に答える 2

1

のようなものにアクセスしているよう$stats[4]['div'][0]です。配列表記は属性用です。XML を投稿してください。SimpleXML を使用するときは決して頼らないでくださいprint_r()

私はあなたが使いたいと思っていますが$stats[4]->div、それが何の[0]ためにあるのか分かりません。[0]を使用して見た何かが原因で、ランダムに追加しようとしたと思いますがprint_r()、これは正しくありません。print_r()SimpleXML を扱う場合は使用しないでください。SimpleXML をオブジェクトや配列と見なさないでください。それらは単にXMLにアクセスする方法です。重要なのは XML です。SimpleXML は、おなじみのオブジェクト構文と配列構文を使用しますが、オブジェクトと配列のコレクションとは考えないでください。そうではないからです。

于 2010-11-19T16:37:27.460 に答える
0

xpath クエリを使用して、これらの値をすべて個別に取得してみませんか?

于 2010-11-19T16:03:20.413 に答える