2012-06-28 77 views
0

我想在xml文件中使用xpath搜索一個php變量,但是失敗了。它與一個硬編碼值,所以我幾乎有..xpath搜索一個php變量

<visitors> 
<detail> 
    <id>876867</id> 
    <name>Bob McHaggis</name> 
    <email>[email protected]</email> 
</detail> 
<detail> 
    <id>897987</id> 
    <name>Mark McBob</name> 
    <email>[email protected]</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 我想呼應的名字和電子郵件,因此基於這是馬克McBob & [email protected]

回答

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將是包含希望只是一個<detail>元件的array。它可能是一個空陣列,如果找不到<detail>與指定<id>,這是if(empty(…))檢查什麼。如果$details數組不爲空,我們真的只對第一個數組感興趣($details[0])。

若要訪問可用信息的<detail>內,爲「基本用法」頁上所說明的,元件可以用正常的對象屬性語法($detail->name)進行訪問。這樣做會返回該項目的一個對象(例如<name>),因此要使用(string)作爲字符串獲取該對象的值爲type cast

+0

xpath injection ... grml ....。 – hakre

-1

你這麼做其實是幫了不少你並不需要去那裏。首先,你不需要循環。另一方面,在循環中,將上下文XML轉換爲字符串(::asXML()),然後將其轉換回XML(simplexml_load_string())。

所有你需要的是:

$xml = "<visitors><detail><id>876867</id><name>Bob McHaggis</name><email>[email protected]</email></detail><detail><id>897987</id><name>Mark McBob</name><email>[email protected]</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