Liviu ZeJah
Liviu ZeJah

Reputation: 113

PHP Xpath Select elements after

I'm trying to get the subcategories for each category with xpath from this html code :

<ul class="simple_list">
<li class="category"><span class="category_span">ILUMINAT UTILITAR</span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/indus70">Indus70</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/apliled48">ApliLED48</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/minoris">Minoris</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/canopus_230v">Canopus 230V</a></span></li>
<li class="category"><span class="category_span">ILUMINAT OFFICE</span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/pavo_1_modul">Pavo 1 modul</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/laminar">Laminar</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/alcor_t">Alcor T</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/grup/Cassiopeia">Cassiopeia</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/sirius_8_module">Sirius 8 module</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/cygnus">Cygnus</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/grup/Aries">Aries</a></span></li>
<li class="category"><span class="category_span">ILUMINAT INDUSTRIAL</span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/castor_6_module">Castor 6 module</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/grup/Corona">Corona</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/octans">Octans</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/lacerta_3_module">Lacerta 3 module</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/fornax">Fornax</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/grup/Cetus">Cetus</a></span></li>
<li class="category"><span class="category_span">ILUMINAT DE EXTERIOR</span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/grup/ELMA80">ELMA80</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/solaris_2_module">Solaris 2 module</a></span></li>
<li class="category"><span class="category_span">BECURI CU LED</span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/grup/LEC">LEC</a></span></li>
<li class="category"><span class="category_span">ACCESORII</span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/grup/Banda">Banda</a></span></li>
<li class="subcat"><span class="subcat_span"><a href="/produse/drosel">Drosel</a></span></li>

For the subcat items I tried this :

$xpath->query('//li[@class="subcat" and not(preceding-sibling::li[@class="category"]['.$i.'])])

I want to extract all subcat items under a category item ... any xpath idea would be great .

At this point I'm doing this :

for ($i = 0; $i<=$nodecount; $i++) {
    foreach( $xpath->query('//li[@class="category"]['.$i.']') as $category ) {

      echo "<br/>" . "$i - Main Categ Name : " . $category->nodeValue . "<br/>";

        //Now get the subcateg names and links
        $subnodecount = 0;
        foreach( $xpath->query('//li[@class="subcat"]') as $sub_categ_links_on_page ) {
          $subnodecount++;
        }


        for ($y = 0; $y<=$subnodecount; $y++) {
            foreach( $xpath->query('//li[@class="subcat" and preceding-sibling::li[@class!="category"]]['.$i.']['.$y.']') as $sub_category ) {

                echo "--- $y - Sub Categ Name : " . $sub_category->nodeValue . "<br/>";             

            }//end foreach
        }// end FOR $y  

        ///////////////////////////////////////////////////////////
    }//end foreach
}// end FOR $i

But I am stuck at the subcategs part..

I'm looking to get this output :

1 - Main Categ Name : ILUMINAT UTILITAR

--- 1 - Sub Categ Name : ApliLED48

--- 2 - Sub Categ Name : Minoris

--- 3 - Sub Categ Name : Canopus 230V

--- 4 - Sub Categ Name : Pavo 1 modul

[and so on]

Live code can be found and fiddled with, here : http://codepad.viper-7.com/i8hweN

Upvotes: 1

Views: 123

Answers (1)

Kevin
Kevin

Reputation: 41873

To get all those list below the category you could also use != in this case:

$xpath->query('//li[@class="subcat" and preceding-sibling::li[@class!="category"]]');

Sample Output

As an alternative, you could gather all those results first. Then you could just use CSS or a simple formatting for presentation:

$elements = $xpath->query('//li[@class="subcat" and preceding-sibling::li[@class!="category"]]');
$list = array();
if($elements->length > 0) {
    foreach($elements as $cat) {
        $category = $xpath->evaluate('string(./preceding-sibling::li[@class="category"][1])', $cat);
        $list[$category][] = $cat->nodeValue;
    }
}

// presentation
$i = $j = 1;
foreach($list as $category => $subcategory) {
    echo $i . '. ' . $category . '<br/>'; $i++;
    foreach($subcategory as $sub) {
        echo str_repeat('&nbsp;', 5);
        echo $j .'. ' . $sub . '<br/>'; $j++;
    }
    $j = 1;
}

Sample Output

Upvotes: 1

Related Questions