XPath множественный запрос, разбор по классу и по порядку

Текущая ситуация :

Я пытаюсь проанализировать DomDocument с XPath, результатом должен быть массив с категориями и подкатегориями.
Проблема в том, что человек, создавший HTML, не структурировал информацию с подкатегориями в основных категориях, они просто разграничены чистым CSS.

HTML выглядит следующим образом:

  <div class="menu_item">Main Category AC</div>

<div class="submenu_div">

<a href="http://www.link.com/313">
<div class="sub_item">
<h3>Sub Categ A</h3>
</div>
</a>

<a href="http://www.link.com/475">
<div class="sub_item">
<h3>Sub Categ B</h3>
</div>
</a>

<a href="http://www.link.com/321">
<div class="sub_item">
<h3>Sub Categ C</h3>
</div>
</a>

</div>

<div class="menu_item">Main Category BC</div>

<div class="submenu_div">

<a href="http://www.link.com/313">
<div class="sub_item">
<h3>Sub Categ X</h3>
</div>
</a>

<a href="http://www.link.com/475">
<div class="sub_item">
<h3>Sub Categ Y</h3>
</div>
</a>

<a href="http://www.link.com/321">
<div class="sub_item">
<h3>Sub Categ Z</h3>
</div>
</a>

</div>

Теперь, с помощью этого php я могу извлечь категории и подкатегории, но это просто список, я не знаю, что подкатегория в какой категории, и я застрял.
Как я могу использовать Xpath для извлечения подкатегорий основной категории и назначения родителя для каждой подкатегории?

    $doc = new DomDocument;
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);

foreach( $xpath->query('//div[@class="menu_item"]|//div[@class="submenu_div"]/a/div/h3') as $e ) {
echo $e->nodeValue, "<br />\n";
}

0

Решение

Это эскиз для решения с использованием XPath. Внешний цикл ищет категории и печатает их. Он также отслеживает положение внешнего div в переменной $i, Внутренний цикл создает другой XPath, который выбирает $idiv тег, затем переходит к следующему брату и, наконец, спускается к тексту подкатегории.

Обратите внимание, что вам все еще нужно хранить эти данные в соответствующей структуре данных. Я не знаком с PHP, поэтому не могу вам чем-то помочь.

$i = 0;
foreach( $xpath->query('//div[@class="menu_item"]/text()') as $category ) {

$i = $i + 1;
echo "Category: " . $category->nodeValue . "\n";
foreach ( $xpath->query('//div[@class="menu_item"][' . $i . ']/following-sibling::div[1][@class="submenu_div"]/a/div/h3/text()') as $subcategory) {
echo "  Subcategory: " . $subcategory->nodeValue . "\n";
}

}
1

Другие решения

Основываясь на ответе выше, я сделал несколько модификаций, чтобы включить цикл for, а также получить ссылку:

for ($i = 0; $i <= 25; $i++) {
foreach( $xpath->query('//div[@class="menu_item"]['.$i.']/text()') as $category ) {
echo $i . " Category: " . $category->nodeValue . "<br/>\n";
foreach ( $xpath->query('//div[@class="menu_item"][' . $i . ']/following-sibling::div[1][@class="submenu_div"]/a') as $subcategory) {
echo '-----'. $i . " Subcategory: " . $subcategory->nodeValue . "<br/>\n";
echo '-----'. $i . " Link: " . $subcategory->getAttribute("href") . "<br/>\n";
}

echo "<br/>";

}
}

еще раз спасибо Маркус Риккерт!

0

По вопросам рекламы [email protected]