我正在尝试使用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
答案 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