Доступ к свойствам SimpleXMLElement без зацикливания - PullRequest
1 голос
/ 19 ноября 2010

Я испробовал как подход SimpleXMLElement XPath, так и подход DOMDocument XPath, но, похоже, не все так просто, но по крайней мере с маршрутом SimpleXMLElement я мог бы распечатать результаты var и посмотреть, что происходит. на. (См. Результаты ниже)

Я хочу использовать XPath-запросы, не просматривая результаты. Полагаю, я просто хочу получить доступ к результатам, как к массиву, но, похоже, проблема заключается в том, чтобы обойти объекты SimpleXMLElement в этом массиве результатов.

Я запрашиваю фрагмент HTML с помощью div с определенным классом. Есть несколько 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.

Так как же мне получить эти значения за пределами объектов SimpleXMLElement, не просматривая массив $ stats? Что-нибудь похожее на то, что я уже пробовал выше?

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Я вижу, что вы получаете доступ к таким вещам, как $stats[4]['div'][0]. Обозначение массива для атрибутов. Пожалуйста, оставьте свой XML и никогда не полагайтесь на print_r() при использовании SimpleXML.

Я предполагаю, что вы хотите использовать $stats[4]->div, хотя я понятия не имею, для чего это [0]. Я предполагаю, что вы случайно попытались добавить [0] из-за чего-то, что вы видели, используя print_r(), что неверно. Не используйте print_r() при работе с SimpleXML. Не рассматривайте SimpleXML как объекты и массивы, это просто способы доступа к XML . Что важно, так это ваш XML. SimpleXML использует знакомый синтаксис объекта и синтаксис массива, но не думайте о нем как о коллекции объектов и массивов, потому что это не так.

0 голосов
/ 19 ноября 2010

Почему бы не использовать запросы xpath для получения всех этих значений отдельно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...