2010-11-19 1 views
1

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

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

Я запрашиваю фрагмент 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.

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

+0

Не используйте 'print_r()'. Не публикуйте вывод 'print_r()'. Отправьте исходный XML, что вы хотите сделать и как вы пытаетесь это сделать. –

ответ

1

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

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

+0

Ты прав Джош. Это и стало проблемой. Я полагался на print_r(), когда я должен был просто попытаться сохранить. Синтаксис $ stats [4] -> div [0] сделал трюк. – purefusion

+0

BTW, в приведенном выше примере (да, вывод print_r(), я знаю ...) $ stats [4] -> div [0] == 'Clicks' ... поэтому я думаю, что вывод print_r() isn Совершенно злобно. Всего 98%. ;) – purefusion

0

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

+0

Разве это не было бы намного медленнее? – purefusion

+0

Возможно. Но это зависит от того, как часто ваш сценарий будет делать это, и даже тогда, делать тесты разных подходов, либо с помощью microtime(), xhprof, xdebug, либо чего-то еще. Потеря производительности может быть очень маленькой, и более чистый код может стоить того. –