XPATH — как использовать несколько путей

Я использую xpath для получения текстового значения некоторых ссылок (а) в данном элементе. Затем я помещаю результаты в массив с именем $tableau. Все работает нормально :) Дело в том, что теперь я хотел бы также получить href этих ссылок. Итак, в моем массиве есть как текстовое значение, так и href. Другое дело, что я понятия не имею, как это сделать. Надеюсь, кто-то может помочь. Заранее благодарим вас за ответы. Ваше здоровье. Марк

$url = 'http://www.somesite.com';
$path = '.../a';
$tableau = array();

$dom = new DOMDocument();
@$dom->loadHTML($url);
$xpath = new DomXPath($dom);
$x = $xpath->query($path);

foreach ($x as $value)
     array_push($tableau, $value->nodeValue);

person Marc    schedule 13.03.2012    source источник


Ответы (3)


Попробуй это:

foreach ($x as $value)
{
    array_push($tableau, $value->nodeValue, $value->getAttribute('href'));
}
person javram    schedule 13.03.2012
comment
Привет Джаврам. Спасибо за попытку помочь. Я знаю, как получить href... Моя проблема в том, что я не знаю, как передать как текстовое значение (a), так и href (@href) в мой массив (одновременно) - person Marc; 14.03.2012
comment
Массив будет иметь хранилище для одной строки в каждом индексе массива. Если вы хотите хранить несколько значений в каждом индексе массива, вам понадобится массив, поддерживающий сложный тип. В качестве альтернативы вы можете объединить nodeValue и href вместе с разделителем, а затем сохранить его в одной позиции массива. - person javram; 14.03.2012
comment
Основываясь на подсказке Виреша, я узнал, что многомерные массивы могут быть решением. Как я уже сказал, мне нужно время, чтобы проверить это... Еще раз спасибо, что нашли время, чтобы попробовать помочь мне. - person Marc; 14.03.2012
comment
Джаврам, чтобы проверить ваше предложение, мне нужно внести изменения в мой код, что займет некоторое время. Тем не менее, getAttribute('href') — отличная подсказка. Спасибо... - person Marc; 14.03.2012

вы можете использовать ассоциативный массив

 the code might look like this(not sure abt the syntax though)
 arr = [ "1" => [ "text" => "value1" , "href" => "value1"],
         "2" => [ "text" => "value2", "href" => "value2"]];

выражение xpath для получения href всех тегов привязки выглядит примерно так

  ("//a/@href");

  //     --> select a from all the descendants of the root
  a      --> select the anchor tag
  @href  --> select the href of this anchor (@ to select attributes) 

преобразовать это выражение в эквивалентный код PHP

person vireshas    schedule 13.03.2012
comment
Привет, вирешас. Я знаю, как получить href... Дело в том, что я хотел бы поместить как текстовое значение (a), так и href (@href) в свой массив. И я не знаю, как сделать и то, и другое одновременно... - person Marc; 14.03.2012
comment
вам нужно использовать ассоциативный массив, я не уверен в синтаксисе, но он должен выглядеть примерно так [text=value,href=value].. вы также можете попробовать использовать хэш - person vireshas; 14.03.2012
comment
Ваша идея использования ассоциативных массивов заставила меня исследовать, что это такое. Читая статьи, я узнал, что решением могут быть многомерные массивы. Мне нужно время, чтобы подтвердить это... Спасибо, вирешас :) - person Marc; 14.03.2012
comment
Добро пожаловать, Марк .. я отредактирую ответ, чтобы отразить ваши потребности :) - person vireshas; 14.03.2012

Благодаря подсказкам javram и vireshad мне удалось найти решение. Смотрите здесь ниже:

$url = 'http://www.somesite.com';
$path = '.../a';
$tableau = array();

$dom = new DOMDocument();
@$dom->loadHTML($url);
$xpath = new DomXPath($dom);
$x = $xpath->query($path);

foreach ($x as $value)
     array_push($tableau, array($value->nodeValue, $value->getAttribute('href')));
person Marc    schedule 13.03.2012