2013-02-13 229 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