Search code examples
phpxmlxpathdomxpath

XML Xpath with PHP, node, subnodes how to select correctly


Hi i have this type of XML type exactly. And i need to get information using PHP xpath. XML looks like:

<row>
<id>1</id>
<product>
    <prodRow>
        <PID>Aa</PID>
    </prodRow>
    <prodRow>
        <PID>Ab</PID>
    </prodRow>
</product>
</row>
<row>
<id>2</id>
<product>
    <prodRow>
        <PID>Ba</PID>
    </prodRow>
    <prodRow>
        <PID>Bb</PID>
    </prodRow>
</product>
</row>
<row>
<id>3</id>
<product>
    <prodRow>
        <PID>Ca</PID>
    </prodRow>
    <prodRow>
        <PID>Cb</PID>
    </prodRow>
</product>
</row>

PHP script:

    if(file_exists("band.xml"))
    {
   $DOM = new DOMDocument();
       $DOM->load("band.xml");
   $xpath = new DOMXPath($DOM);
   $row = $xpath->query("//row/id");
   $prodRowID = $xpath->query("//row/product/prodRow");

    foreach($row as $vID)
    {
    echo "<b>".$vID->nodeValue."</b><br /><br />";  

    foreach($prodRowID as $pID)
    {
                            $prodID = $pID->getElementsByTagName("PID");
            echo "<b>".$prodID->item(0)->nodeValue."</b><br /><br />";  
    }       

    }

      }

The answer i get and don't know how to do that, everytime the row is reached, the PID is printing from all rows:

1
Aa, Ab, Ba, Bb, Ca, Cb
2
Aa, Ab, Ba, Bb, Ca, Cb
3
Aa, Ab, Ba, Bb, Ca, Cb

The answer i need to get:

1
Aa, Ab
2
Ba, Bb
3
Ca, Cb

Thanks for answer this is my headache, don't know how to do that.


Solution

  • You need to select the prodRows inside the first foreach, indicate the context node, and not use an absolute XPath:

    foreach($row as $vID)
    {
       echo "<b>".$vID->nodeValue."</b><br /><br />";  
    
       $prodRowID = $xpath->query("../product/prodRow", $vID);
       foreach($prodRowID as $pID)
       {
            echo "LIGA <b>".$pID->nodeValue."</b><br /><br />"; 
       }       
    }