gpt4 book ai didi

php - foreach循环内的xpath重复相同的结果

转载 作者:可可西里 更新时间:2023-10-31 23:50:06 24 4
gpt4 key购买 nike

我使用下面的代码解析一个XML文件,没问题:

 foreach ($xml->product as $products) {

$title = $products->name; etc etc

但是,由于 XML 的结构,我必须在我需要确保它返回正确数据的节点之一上使用 xpath

 $actors = $xml->xpath("//property[name[. ='Actors']]/value");

$actor = $actors[0];

这很好用,但它总是返回 XML 文件的第一条记录,我需要它来跟上循环,如果这有意义的话。

我尝试了以下但同样的事情发生了:

 $actors = $products->xpath("//property[name[. ='Actors']]/value");

这是有问题的 xml,但是我上面的示例使用了一个名为 name 的节点,它具有数据 Actors,将其交换为 Format,您的想法与下面的节点相同

<name>Format</name>


<properties>
<group>
<name>Product</name>
<property>
<id>48546006</id>
<name>Product name</name>
<value>JOLLY PHONICS (JOLLY PHONICS S.)</value>
</property>
</group>
<group>
<name>Product properties</name>
<property>
<id>43560296</id>
<name>Product Title</name>
<value>JOLLY PHONICS (JOLLY PHONICS S.)</value>
</property>
<property>
<id>43560292</id>
<name>Format</name>
<value>DVD</value>
</property>
</group>
</properties>

这是我正在使用的完整 foreach 循环(我省略了其中的一些,因为您不需要阅读多个内容,它们都可以正常工作,正如您将看到的那样:

foreach ($xml->product as $products) { // AA

$title = $products->name;

$PRid = $products->id;

$actors = $xml->xpath("//property[./name[.='Actors']]/value[next()]"); // this ok but repeats

$actors = $actors[0];

$genre = $xml->xpath("//property[name[. ='Genre']]/value");

$genre = $genre[0];

$prodcat = $products->{'category'};

$addline = mysql_query("
insert into dbname(
blah blah
)
VALUES (
blah blah
) ON DUPLICATE KEY UPDATE lowprice='$lowprice', highprice='$highprice'",$db);
if(!$addline) { echo "cannot add to table here".mysql_error(); exit; } // debug

foreach ($xml->product->retailer as $retailer) { // BB

this is another foreach loop but works perfectly

} // close BB
} // close AA

所以,问题是——我在 XML 文件中有需要提取的节点,它们总是在名为属性的节点中,但是,我不能简单地使用例如name[2] 因为它们有时在不同的地方 - 因此建议我使用 xpath 从我需要的特定节点获取数据,因为它更精确 - 问题是它工作正常但由于某种原因不会只需从当前节点获取数据,但是我尝试 ./或 .//,它总是从第一个节点返回数据。

有什么想法吗?

最佳答案

正如我所怀疑的(在您发布 PHP 代码之前)。您不在循环体中使用相对路径。当然,这总是会产生相同(即绝对)的结果。

您必须使用您的 XPath 引用 $product(而不是 $xml)从那里使用相对路径,如下所示:

foreach ($xml->product as $product) { // AA
$title = $product->name;
$PRid = $product->id;
$actors = $product->xpath(".//property[name='Actors']/value");
$genre = $product->xpath(".//property[name='Genre']/value");
$prodcat = $product->{'category'};

$addline = mysql_query("
insert into dbname(
blah blah
)
VALUES (
blah blah
) ON DUPLICATE KEY UPDATE lowprice='$lowprice', highprice='$highprice'", $db
);

if(!$addline) {
echo "cannot add to table here".mysql_error(); exit; // debug
}

foreach ($xml->product->retailer as $retailer) { // BB
this is another foreach loop but works perfectly
} // close BB
} // close AA

PS:您真的想在 AA 循环运行 BB 循环吗(或者您实际上是想在此处循环遍历 $product->retailer)?

关于php - foreach循环内的xpath重复相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7687851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com