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 ファイル内の 1 つの項目を選択するために、何かをループする必要はまったくありません。以下のコード例と、それがあなたのコードと異なる理由は、上記のページをよく読んだ後に明らかになるはずです。

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

上記のアイデアは、できれば 1 つの要素だけを含むもの$detailsになるということです。指定された で no が見つかった場合は、空の配列である可能性があります。これがチェック対象です。配列が空でない場合、実際に関心があるのは最初の配列 ( ) だけです。array<detail><detail><id>if(empty(…))$details$details[0]

内で利用可能な情報にアクセスする<detail>には、「基本的な使用方法」ページで説明されているように、通常のオブジェクト プロパティ構文 ( $detail->name) を使用して要素にアクセスできます。そうすることで、その項目のオブジェクト (たとえば、<name>) が返されるため、値を文字列として取得するには、 を使用してオブジェクトを型キャスト(string)ます。

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