0

我正在尝试使用 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。但是基于找到的值,我如何访问匹配键的名称和电子邮件?

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

4

2 回答 2

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><id>if(empty(…))$details$details[0]

要访问 中可用的信息<detail>,如“基本用法”页面所述,可以使用普通对象属性语法 ( $detail->name) 访问元素。这样做会返回该项目的对象(例如<name>),因此要以字符串形式获取值,该对象是使用类型转换的(string)

于 2012-06-28T18:55:28.840 回答
-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
于 2012-06-28T18:25:10.920 回答