Reputation: 113
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
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"]]');
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(' ', 5);
echo $j .'. ' . $sub . '<br/>'; $j++;
}
$j = 1;
}
Upvotes: 1