XML Xpath с PHP, узел, подузлы, как правильно выбрать
Привет у меня есть этот тип 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 ответа
Решение
Вам нужно выбрать 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 />";
}
}
Ваш внутренний foreach
всегда делает то же самое, потому что это никак не относится к вашей внешней foreach
, То, что вы хотите сделать, это перебирать все //row
узлы, затем запрос id
а также product/prodRow
оттуда с параметром контекста DOMXpath::query()
,