2013-02-13 185 views
0

嗨,我有这种类型的XML类型。我需要使用PHP xpath获取信息。 XML是什么样子:XML Xpath与PHP,节点,子节点如何正确选择

<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 

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

回答

1

您需要选择第一foreachprodRow S,表示上下文节点,而不是使用绝对路径的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 />"; 
    }  
} 
+0

非常感谢帮助,两个答案都是正确的:)你是最好的。你帮了我很多JLRishe。 – ArnasGo 2013-02-13 10:59:09

0

你内心foreach不会总是相同的,因为它不以任何方式指到您的外部foreach。你想要做的是遍历所有//row节点,然后查询idproduct/prodRow从那里与上下文参数DOMXpath::query()

+0

谢谢,我会牢记这一点,你说得对,我经常在//行节点中引用,而JLRishe在下面显示如何不这样做。谢谢你们。干杯! – ArnasGo 2013-02-13 10:58:18