【问题标题】:xpath search for a php variablexpath 搜索 php 变量
【发布时间】:2012-06-28 16:51:51
【问题描述】:

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

【问题讨论】:

    标签: php xml xpath


    【解决方案1】:

    我最初的建议是花几分钟时间(重新)阅读 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,希望只包含一个&lt;detail&gt; 元素。如果在指定的&lt;id&gt; 中找不到&lt;detail&gt;,它可能是一个空数组,这是if(empty(…)) 检查的内容。如果 $details 数组不为空,我们只对第一个 ($details[0]) 感兴趣。

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

    【讨论】:

      【解决方案2】:

      你实际上做了很多你不需要的事情。一方面,您不需要循环。另一方面,在循环中,将上下文 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        • 2012-01-30
        • 2012-04-11
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        相关资源
        最近更新 更多