私は 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 オブジェクトを超えてこれらの値を取得するにはどうすればよいでしょうか? 上記ですでに試したことに似たものはありますか?