Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 重复相同结果的foreach循环中的xpath_Php_Xml_Xpath - Fatal编程技术网

Php 重复相同结果的foreach循环中的xpath

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

我使用以下代码解析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的节点,该节点具有数据参与者,将其替换为格式,您的想法与下面有一个节点相同,该节点是

<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