我尝试使用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进行了很好的检查。但是,根据找到的值,我如何访问匹配的键的名称和电子邮件?
找到并匹配: 897987我想回应的名称和电子邮件到,所以基于这是马克McBob & mark@gmail.com
发布于 2012-06-29 02:55:29
我最初的建议是花几分钟时间(重新)通读一下手册中的页面。
对于选择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>元素。如果没有找到具有指定<id>的<detail>,则它可能是一个空数组,这是if(empty(…))检查的内容。如果$details数组不为空,我们实际上只对第一个数组($details[0])感兴趣。
要访问<detail>中的可用信息,可以使用普通对象属性语法($detail->name)访问元素,如“基本用法”页面中所述。这样做会返回该项目的一个对象(例如<name>),因此为了获取字符串形式的值,该对象是使用(string)的。
发布于 2012-06-29 02:25:11
你实际上做了很多你不需要做的事情。首先,你不需要循环。另一方面,在循环中,将上下文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 McBobhttps://stackoverflow.com/questions/11249376
复制相似问题