@En1ken

Как получить список из xpath?

Всем привет, возникла такая вот проблемма. Необходимо получить данные из div блока с помощью xpath
<div class="reports">
  <div class="ERROR">
    <div class="name"></div>
    <div class="author"></div>
  </div>
  <div class="SUCCESS">
    <div class="name"></div>
    <div class="author"></div>
  </div>
  <div class="SUCCESS">
    <div class="name"></div>
    <div class="author"></div>
  </div>
  <div class="ERROR">
    <div class="name"></div>
    <div class="author"></div>
  </div>
  <div class="SUCCESS">
    <div class="name"></div>
    <div class="author"></div>
  </div>
</div>

Начало запроса составил так

$xpath = new DOMXpath( $doc );
$results = $xpath->query( '//div[@class="reports"]' );

Я понимаю что нужно использовать foreach но как не могу понять и разобраться, при этом мне нужно получить значения атрибута name если это находится в блоке div class="SUCCESS" И значение атрибута author если это блок div class="ERROR" ? Готов отблагодарить за помощь.
  • Вопрос задан
  • 685 просмотров
Решения вопроса 2
glebovgin
@glebovgin
Full Stack Web Developer
День добрый.

получить значения атрибута name

Вероятно, вы имели ввиду "получить значения внутри div с class = name".

Вы почти сами написали нужный xpath. Если в лоб, то:
это для name внутри SUCCESS
//div[@class="reports"]/div[@class="SUCCESS"]/div[@class="name"]

это для author внутри ERROR
//div[@class="reports"]/div[@class="ERROR"]/div[@class="author"]
Ответ написан
Kwisatz
@Kwisatz
Больше web-приложений, хороших и разных
Вариант раз
$results = $xpath->query( '//div[@class="reports"]/div[@class="ERROR"]/div[@class="author"]' );
foreach ($results as $node)
  {
  echo $node->nodeValue;
  }
$results = $xpath->query( '//div[@class="reports"]/div[@class="SUCCESS"]/div[@class="name"]' );
foreach ($results as $node)
  {
  echo $node->nodeValue;
  }


Вариант 2:
$results = $xpath->query( '//div[@class="reports"]/div' );
foreach ($results as $node)
  {
  $class=($node->getAttribute('class')==='SUCCESS') ? 'name' : 'author';
  foreach ($node->childNodes as $child)
    {
    if ($child->nodeName=='div' && $child->getAttribute('class')===$class)
      {
      echo $child->nodeValue;
      break;
      }
    }
  }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы