2012-06-28 6 views
0

Я пытаюсь найти переменную php в XML-файле, используя xpath, но терпеть неудачу. Он работает с жестко закодированным значением, поэтому я почти там ..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]; ?> 

Это работает большую проверку для идентификатора с идентификатором хранится в куках. Но на основе этой ценности, которую можно найти, как мне получить доступ к имени и электронной почте для сопоставленного ключа?

Найдено & совпадений: 897987 Я хочу повторить имя и адрес электронной почты, так что основано на том, что Марк MCBOB & [email protected]

ответ

0

Моего первоначальный совет будет принимать хорошие несколько минут, чтобы (заново) прочитать SimpleXML Basic Usage страниц в PHP руководстве.

Для выбора одного элемента в 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> с указанным <id>, что и проверяет if(empty(…)). Если массив $details не пуст, нас действительно интересует только первый ($details[0]).

Чтобы получить доступ к информации, имеющейся в <detail>, как описано на странице «Основы использования», элементы могут быть доступны с нормальным объекта недвижимости синтаксиса ($detail->name). Это возвращает объект для этого элемента (например, <name>), поэтому для получения значения в виде строки объект равен type cast с использованием (string).

+0

xpath инъекция ... 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