Перебирать элементы и анализировать их с помощью DOMDocument() в PHP

У меня есть список таких элементов:

<div class="list">
    <div class="ui_checkbox type hidden" data-categories="57 48 ">
        <input id="attraction_type_119" type="checkbox" value="119"
        <label for="attraction_type_119">Aquariums</label>
    </div>
    <div class="ui_checkbox type " data-categories="47 ">
        <input id="attraction_type_120" type="checkbox" value="120"
        <label for="attraction_type_120">Arènes et stades</label>
    </div>
</div>

Как я могу просмотреть их с помощью DOMDocument, чтобы получить такие подробности, как:

  • категории данных
  • входное значение
  • текст этикетки

Вот что я пробовал:

$dom = new DOMDocument();
$dom->loadHTML($html);
$xp = new DOMXpath($dom);
$elements = $dom->getElementsByTagName('div');
$data = array();
foreach($elements as $node){
    foreach($node->childNodes as $child) {
        $data['data_categorie'] = $child->item(0)->getAttribute('data_categories');
        $data['input_value'] = $child->item(0)->getAttribute('input_value');
        $data['label_text'] = $child->item(0)->getAttribute('label_text');
    }
}

Но это не работает.

Что мне здесь не хватает, пожалуйста?

Спасибо.


person popol    schedule 07.06.2020    source источник


Ответы (2)


Установка нескольких значений в цикле $data['data_categorie'] = с использованием одного и того же ключа для массива $data = array(); приведет к перезаписи значений на каждой итерации.

Поскольку у вас есть несколько элементов, вы можете создать временный массив $temp = []; для хранения значений и добавить массив в массив $data после сохранения всех значений для текущей итерации.

Поскольку вы уже используете DOMXpath, вы можете получить div с помощью < em>class="list", используя такое выражение, как //div[@class="list"]/div, и зациклить дочерние узлы, проверяющие nodeName input, и получить это значение плюс значение следующего родственного элемента, которое является значением ярлык

$data = array();
$xp = new DOMXpath($dom);
$items = $xp->query('//div[@class="list"]/div');
foreach($items as $item) {
    $temp["data_categorie"] = $item->getAttribute("data-categories");
    foreach ($item->childNodes as $child) {
        if ($child->nodeName === "input") {
            $temp["input_value"] = $child->getAttribute("value");
            $temp["label_text"] = $child->nextSibling->nodeValue;
        }
    }
    $data[] = $temp;
}

print_r($data);

Выход

Array
(
    [0] => Array
        (
            [data_categorie] => 57 48 
            [input_value] => 119
            [label_text] => Aquariums

        )

    [1] => Array
        (
            [data_categorie] => 47 
            [input_value] => 120
            [label_text] => Arènes et stades

        )

)

демонстрация Php

person The fourth bird    schedule 07.06.2020

Я использовал string() и evaluate, чтобы получить результат в одном запросе:

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$elements = $xpath->query('//div[contains(@class, "ui_checkbox")]');
foreach($elements as $node) {
    $data = array();
    $data['data_categorie'] = $xpath->evaluate('string(./@data-categories)', $node);
    $data['input_value'] = $xpath->evaluate('string(./input/@value)', $node);
    $data['label_text'] = $xpath->evaluate('string(./label/text())', $node);
}
person gangabass    schedule 07.06.2020