Xpoint
   [напомнить пароль]

PHP, XPath, выбор значения аттрибута

Метки: [без меток]
2009-11-17 09:52:32 [обр] tcolonel[досье]

Всем доброго здравия, помогите разобраться с XPath.

Есть код:

...
<td class="pic">
 <a target="_blank" href="http://pic.mysite.ru/?path=1.jpg">
  <img border="0" src="http://pic.mysite.ru/?path=1l.jpg"/>
 </a>
</td>
...

Как сразу выбрать значение href?
Делаю так:

$result["pic"] = $xml->xpath('//*[@class="pic"]/a/@href');

получаю такой результат:

[pic] => Array
(
 [0] => SimpleXMLElement Object
 (
  [@attributes] => Array
  (
   [href] => http://pic.mysite.ru/?path=1.jpg
  )
 )
)

А хотелось бы вот такой результат получить:

[pic] => Array
(
 [0] => http://pic.mysite.ru/?path=1.jpg
)

Как это можно реализовать?

Спасибо.

спустя 13 минут [обр] tcolonel[досье]

И, если у меня есть код:

...
<td class="pic">
 <div>
  <a target="_blank" href="http://pic.mysite.ru/?path=1.jpg">
   <img border="0" src="http://pic.mysite.ru/?path=1l.jpg"/>
  </a>
 </div>
 <div>
  <a target="_blank" href="http://pic.mysite.ru/?path=2.jpg">
   <img border="0" src="http://pic.mysite.ru/?path=2l.jpg"/>
  </a>
 </div>
 <div>
  <a target="_blank" href="http://pic.mysite.ru/?path=3.jpg">
   <img border="0" src="http://pic.mysite.ru/?path=3l.jpg"/>
  </a>
 </div>
</td>
...

То, используя:

$result["pic"] = $xml->xpath('//*[@class="pic"]/div/a/@href');

вместо

[pic] => Array
(
 [0] => SimpleXMLElement Object
 (
  [@attributes] => Array
  (
   [href] => http://pic.mysite.ru/?path=1.jpg
  )
 )
 [1] => SimpleXMLElement Object
 (
  [@attributes] => Array
  (
   [href] => http://pic.mysite.ru/?path=2.jpg
  )
 )
 [2] => SimpleXMLElement Object
 (
  [@attributes] => Array
  (
   [href] => http://pic.mysite.ru/?path=3.jpg
  )
 )
)

мне нужно получить

[pic] => Array
(
 [0] => http://pic.mysite.ru/?path=1.jpg
 [1] => http://pic.mysite.ru/?path=2.jpg
 [2] => http://pic.mysite.ru/?path=3.jpg
)

Спасибо.

спустя 1 час 1 минуту [обр] Алексей Полушин(62/231)[досье]
Ну как бы про SimpleXMLElement::xpath - "Returns an array of SimpleXMLElement objects or FALSE in case of an error."
Так что пишите свою обертку
спустя 5 часов [обр] tcolonel[досье]
А для танкистов можно еще раз?
спустя 57 минут [обр] Давид Мзареулян(536/1003)[досье]
$nodes = $xml->xpath('//*[@class="pic"]/div/a/@href');
foreach ($nodes as $node) {
    echo "Href = ".((string)$node)."\n";
}
спустя 3 часа 14 минут [обр] tcolonel[досье]

А, ну так это просто - так я уже делал ))) Я думал что можно сразу это сделать без циклов - при самом парсинге.

Спасибо.

спустя 4 часа 24 минуты [обр] Давид Мзареулян(536/1003)[досье]
tcolonel[досье] Нет, сразу нельзя — документированное поведение именно такое, как процитировал Алексей.
спустя 3 часа 29 минут [обр] tcolonel[досье]
В этом я уже убедился - без изучения документации (изначально просто не было времени и стряпал из готовых примеров) - путем перебора как минимум 10-15 комбинаций. Да уж .. Читать мануал нужно ...
Powered by POEM™ Engine Copyright © 2002-2005