Php 重复相同结果的foreach循环中的xpath
我使用以下代码解析XML文件,没有问题:Php 重复相同结果的foreach循环中的xpath,php,xml,xpath,Php,Xml,Xpath,我使用以下代码解析XML文件,没有问题: foreach ($xml->product as $products) { $title = $products->name; etc etc 然而,由于XML的结构,我必须在其中一个节点上使用xpath,以确保它返回正确的数据 $actors = $xml->xpath("//property[name[. ='Actors']]/value"); $actor = $actors[0]; 这非常有效,但它总是返回X
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的节点,该节点具有数据参与者,将其替换为格式,您的想法与下面有一个节点相同,该节点是
<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>
所以,问题是-我需要提取XML文件中的节点,这些节点总是在名为property的节点中,但是,我不能简单地使用例如name[2]由于它们有时位于不同的位置-因此建议我使用xpath从我需要的特定节点获取数据,因为它更精确-问题是它工作正常,但由于某些原因,它不会简单地从当前节点获取数据,但是我尝试了。/或。//,它总是从第一个节点返回数据
有什么想法吗?我相信下面的建议对你很有用。在xpath中使用
/
将当前节点引用为根节点,而不是/
:
$actors = $products->xpath("./property[name[. ='Actors']]/value");
可能需要对XML结构进行一些修改,但我们看不到。但关键是使用/
UDPATE
基于,请尝试:
在xpath中,以“/”开头表示从根开始的后代或自我。您可能希望尝试将“.”添加到当前节点的开头
$string = file_get_contents('sampleFromPost.xml');
$xml = simplexml_load_string($string);
$groups = $xml->group;
foreach($groups as $group) {
// Changed Actors to Product Title, since Actors doesn't exist in sample.
$title = $group->xpath('.//property[name="Product Title"]/value');
// -- or --
$title = $group->xpath('.//property/value[../name="Product Title"]');
// do something with the value
var_dump($title);
}
正如我所怀疑的(在发布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
)恐怕没有乐趣,使用$products->xpath而不是$xml->xpath只会产生尝试过的结果。//.//并保留斜杠,但仍然不变thing@DarrenSweeney您能在上面发布一些XML结构吗?/property/value[../name/text()='Actors']
太复杂了。更好:/property[name='Actors']/value
尝试过,谢谢,但它只生成了一个空数组,我很抱歉afraid@Tomalak谢谢无论我用什么方法尝试。/或//都不会产生任何效果。我担心,使用$products->xpath而不是$xml->xpath只会产生一些效果。//.//并且保留斜杠,但仍然是相同的xml文件示例,如果有人看到您的xml,他们会更容易提供帮助。仅供参考属性[name='Actors']
和属性[name[.='Actors']
是等效的。前者更具可读性。除此之外,我相信您没有显示的PHP代码中有一个错误。请发布您使用的实际循环。@Tomalak full loop post,谢谢。当我试着运行新行-$Actors=$product->xpath(.//属性[name='Actors']/value”)[0]-我得到以下信息:解析错误:语法错误,第30行的/home/***/***/htdocs/PRFeed_Films.php中出现意外的“[”-我在其中运行了另一个循环,因为每个主节点中有大约10-15个产品评论,我将它们放入一个单独的数据库中,然后在需要时使用产品id I将它们加入create@Darren好,然后尝试分配[0]
在另一行。显然,PHP不能在同一条语句中执行此操作。
$string = file_get_contents('sampleFromPost.xml');
$xml = simplexml_load_string($string);
$groups = $xml->group;
foreach($groups as $group) {
// Changed Actors to Product Title, since Actors doesn't exist in sample.
$title = $group->xpath('.//property[name="Product Title"]/value');
// -- or --
$title = $group->xpath('.//property/value[../name="Product Title"]');
// do something with the value
var_dump($title);
}
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