遍历元素并使用 PHP 中的 DOMDocument() 解析它们

Loop through elements and parse them whith DOMDocument() in 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');
    }
}

但是没用。

请问我在这里遗漏了什么?

谢谢。

我使用 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);
}

像这样在循环中设置多个值 $data['data_categorie'] = 对数组使用相同的键 $data = array(); 将在每次迭代时覆盖这些值。

由于您有多个项目,您可以创建一个临时数组 $temp = []; 来存储值,并在存储当前迭代的所有值后将该数组添加到 $data 数组。

因为您已经在使用 DOMXpath,您可以使用 class="list" 使用表达式获得 div像 //div[@class="list"]/div 并循环检查 nodeName input 的子节点并获取该值加上下一个兄弟节点的值,即 label[=32 的值=]

$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 demo