XML Xpath与PHP,节点,子节点如何正确选择

时间:2013-02-13 10:47:49

标签: php xml xpath domxpath

我确实有这种类型的XML类型。我需要使用PHP xpath获取信息。 XML看起来像:

<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脚本:

    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 />";  
    }       

    }

      }

我得到的答案不知道怎么做,每次到达行时,PID都会从所有行打印:

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

我需要得到答案:

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

感谢您的回答,这是我的头疼,不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

您需要在第一个prodRow内选择foreach,指明上下文节点,而不是使用绝对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 />"; 
   }       
}

答案 1 :(得分:0)

您的内心foreach始终相同,因为它不会以任何方式引用您的外部foreach。您要做的是迭代所有//row个节点,然后使用上下文参数DOMXpath::query()从那里查询idproduct/prodRow 。< / p>