xpath搜索php变量

xpath搜索php变量,php,xml,xpath,Php,Xml,Xpath,我试图使用xpath在xml文件中搜索php变量,但失败得很惨。它使用一个硬编码的值,所以我就快到了 <visitors> <detail> <id>876867</id> <name>Bob McHaggis</name> <email>bob@gmail.com</email> </detail> <detail> <id>897987&l

我试图使用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]; ?>

876867
鲍勃·麦克哈吉斯
bob@gmail.com
897987
马克·麦克鲍勃
mark@gmail.com
xpath('//visitors/detail')作为$item){
$row=simplexml\u load\u字符串($item->asXML());
$v=$row->xpath('//id[.='.$\u COOKIE[“judsons”].']');
}echo$v[0];?>
这非常有效,可以根据cookie中存储的id检查id。但是基于找到的值,我如何访问匹配密钥的名称和电子邮件

找到并匹配:897987
我想回显姓名和电子邮件地址,因此基于此是Mark McBob&mark@gmail.com

你实际上做了很多你不需要做的事情。首先,你不需要循环。另一方面,在循环中,将上下文XML转换为字符串(
::asXML()
),然后将其转换回XML(
simplexml\u load\u 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"].']');

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

对于在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";
}
xpath(“细节[id='$search\u id']);
如果(空($详细信息)){
echo“未找到“$search_id”的详细信息”;
}否则{
$detail=$details[0];
$name=(字符串)$detail->name;
$email=(字符串)$detail->email;
echo“$name的电子邮件是$email”;
}
上面的想法是,
$details
将是一个
数组
,希望只包含一个
元素。如果在指定的
中未找到
,则该数组可能为空数组,这是
if(empty(…)
检查的内容。如果
$details
数组不是空的,我们实际上只对第一个(
$details[0]
)感兴趣

如“基本用法”页面所述,要访问
中的可用信息,可以使用普通对象属性语法(
$detail->name
)访问元素。这样做将返回该项的对象(例如
),以便获取对象正在使用的
(string)
作为字符串的值

<?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";
}