DOMXpath запрос по запросу - PullRequest
1 голос
/ 28 марта 2012

У меня есть следующий HTML:

[...]
<div class="row clearfix">
    <div class="col1">Data</div>
    <div class="col2">Data</div>
    <div class="col3">Data</div>
    <div class="col4">Data</div>
    <div class="col5">Data</div>
    <div class="col6">Data</div>
    <div class="col7">Data</div>
    <div class="col8">Data</div>
</div><!--// row-->

<div class="row clearfix otherClass">
    <div class="col1">Data</div>
    <div class="col2">Data</div>
    <div class="col3">Data</div>
    <div class="col4">Data</div>
    <div class="col5">Data</div>
    <div class="col6">Data</div>
    <div class="col7">Data</div>
    <div class="col8">Data</div>
</div><!--// row-->

<div class="row clearfix thirdClass">
    <div class="col1">Data</div>
    <div class="col2">Data</div>
    <div class="col3">Data</div>
    <div class="col4">Data</div>
    <div class="col5">Data</div>
    <div class="col6">Data</div>
    <div class="col7">Data</div>
    <div class="col8">Data</div>
</div><!--// row-->
[...]

Я хочу извлечь все эти div из HTML, все они начинаются с "row clearfix" как класса, но могут иметь больше данных После этого я хочу иметь возможность обрабатывать каждый столбец отдельно, поэтому получим значение col1, col2, col3 и т. Д.

Я написал этот код, но сейчас застрял. Кто-нибудь может мне помочь?

        $oDom = new DOMDocument();
        $oDom->loadHtml($a_sHTML);

        $oDomXpath = new DOMXpath($oDom);
        $oDomObject = $oDomXpath->query('//div[@class="row clearfix"]');

        foreach ($oDomObject as $oObject) {
            var_dump($oObject->query('//div[@class="col1"]')->nodeValue);
        }



ОБНОВЛЕНИЕ * Решение *
Благодаря ответам ниже, я получил его работать со следующим кодом:

    $oDom = new DOMDocument();
    @$oDom->loadHtml($a_sHTML);

    $oDomXpath = new DOMXpath($oDom);
    $oDomObject = $oDomXpath->query('//div[contains(@class,"row") and contains(@class,"clearfix")]');

    foreach ($oDomObject as $oObject) {
        foreach($oObject->childNodes as $col)
        {
            if ($col->hasAttributes())
            {
                var_dump($col->getAttribute('class') . " == " . trim($col->nodeValue));
            }
        }
    }

1 Ответ

2 голосов
/ 28 марта 2012

Чтобы соответствовать внешним элементам, я думаю, что вам нужно:

//div[starts-with(@class,"row clearfix")]

или

//div[contains(@class,"row clearfix")]

или

//div[contains(@class,"row") and contains(@class,"clearfix")]

Я бы пошел напоследний, потому что имена классов могут быть в любом порядке.

Я не уверен на 100%, что вы хотите делать с внутренним div, но вы могли бы получить их примерно так:

div[starts-with(@class,"col")]
...