xpath搜索php变量

时间:2012-06-28 16:51:52

标签: php xml xpath

我正在尝试使用xpath在xml文件中搜索php变量,但是失败了。它使用硬编码值,所以我差不多......

<visitors>
 <detail>
  <id>876867</id>
  <name>Bob McHaggis</name>
  <email>bob@gmail.com</email>
 </detail>
 <detail>
  <id>897987</id>
  <name>Mark McBob</name>
  <email>mark@gmail.com</email>
 </detail>
</visitors>

<?php $sxe = simplexml_load_file("/CaptivePortal/visitors.xml");
      foreach($sxe->xpath('//visitors/detail') as $item){
       $row = simplexml_load_string($item->asXML());
       $v = $row->xpath('//id[. ="'.$_COOKIE["judsons"].'"]');
      } echo $v[0]; ?>

这可以很好地检查存储在cookie中的id的id。但根据找到的值,我如何访问匹配密钥的名称和电子邮件?

发现&amp;匹配:897987 我想回复一下这个名字和电子邮件,所以基于这一点就是Mark McBob&amp; mark@gmail.com

2 个答案:

答案 0 :(得分:0)

我最初的建议是花几分钟时间(重新)阅读PHP手册中的SimpleXML Basic Usage页面。

为了在XML文件中选择单个项目,根本不需要循环任何内容。下面的示例代码,以及为什么它与您的不同,在熟悉上述页面后应该变得清晰。

<?php
$search_id = (int) $_COOKIE["judsons"];
$visitors  = simplexml_load_file("/CaptivePortal/visitors.xml");
$details   = $visitors->xpath("detail[id='$search_id']");

if (empty($details)) {
    echo "No details found for '$search_id'.";
} else {
    $detail = $details[0];
    $name   = (string) $detail->name;
    $email  = (string) $detail->email;
    echo "$name's email is $email";
}

上面的想法是$details将是array,其中只包含一个<detail>元素。如果找不到指定<detail>的{​​{1}},则可能为空数组,这是<id>检查的内容。如果if(empty(…))数组不为空,我们真的只对第一个($details)感兴趣。

要访问$details[0]中可用的信息,如“基本用法”页面所述,可以使用普通的对象属性语法(<detail>)访问这些元素。这样做会返回该项目的对象(例如$detail->name),因此要使用<name>作为字符串获取对象type cast

答案 1 :(得分:-1)

你实际上做的很多,你不需要那里。首先,你不需要循环。另一方面,在循环中,将上下文XML转换为字符串(::asXML()),然后将其转换回XML(simplexml_load_string())。

您只需要:

$xml = "<visitors><detail><id>876867</id><name>Bob McHaggis</name><email>bob@gmail.com</email></detail><detail><id>897987</id><name>Mark McBob</name><email>mark@gmail.com</email></detail></visitors>";
$sxe = simplexml_load_string($xml);
$row = $sxe->xpath('detail[id = '.$_COOKIE["judsons"].']');

这会让你排好。提取部分内容:

$name = $row[0]->xpath('name');
echo $name[0]; //Mark McBob