2015-04-05 2 views
2

Я попытался создать файл PHP, который мог бы искать определенную рыбу в документе XML. Это то, что я написал:PHP XPath Query XML?

$FISH_NAME = $_POST["fish_name"]; 
$LOCATION = $_POST["location"]; 
$STATUS = $_POST["status"]; 
$EDIBLE = $_POST["edible"]; 
$SCS_NAME = $_POST["scs_name"]; 
$COLOR = $_POST["color"]; 
$FEATURE = $_POST["feature"]; 


$varsPassed = array(
    $FISH_NAME => "NAME", 
    $LOCATION => "@LOCATION", 
    $STATUS => "STATUS", 
    $EDIBLE => "EDIBLE", 
    $SCS_NAME => "SCS-NAME", 
    $COLOR => "COLORS/COLOR", 
    $FEATURE => "FEATURES/FEATURE" 
); 

$conditional = ""; 

function addToCond($varPassed, $tagName) { 
    if (!empty($varPassed)) { 
     if(!empty($conditional)) { 
      $conditional .= " and {$tagName} = '{$varPassed}'"; 
     } 
     else { 
      $conditional = "{$tagName} = '{$varPassed}'"; 
     } 
    } 
} 

foreach($varsPassed as $current_feature => $current_tag_name) { 
    addToCond($current_feature, $current_tag_Name); 
    echo "{$current_feature}: {$current_tag_name}\n"; 
} 

$query = "/FISHDICT/FISH[@LOCATION = 'REEF']"; 
echo $query; 

$dom = new DOMDocument(); 
$dom->load('server/fish.xml'); 
$xpath = new DOMXpath($dom); 
$value = $xpath->evaluate($query); 
foreach($value as $item) { 
    echo "found: {$item->nodeValue}\n\n"; 
} 

Но это не сработает. Я получаю это отражение на веб-странице:

Скалярии: ИМЯ: ОСОБЕННОСТИ/ВОЗМОЖНОСТЬ/FISHDICT/FISH [@LOCATION = 'РИФ']

Кто-нибудь знает, почему он не делает петлю через каждый переменная post?

XML:

<FISH location="REEF"> 
    <NAME>Angelfish</NAME> 
    <COLORS> 
     <COLOR> Blue </COLOR> 
     <COLOR> Green </COLOR> 
    </COLORS> 
    <FEATURES> 
     <FEATURE> Round head </FEATURE> 
     <FEATURE> Crown on head </FEATURE> 
     <FEATURE> Tall tail fin </FEATURE> 
    </FEATURES> 
    <TAGS> 
     <TAG> REEF-FISH </TAG> 
     <TAG> MULTICOLORED </TAG> 
    </TAGS> 
    <STATUS> ENDANGERED </STATUS> 
    <DESCRIPTION> This fish is found in reefs and is common throughout Bermuda...</DESCRIPTION> 
    <FISHINGLEGAL> FALSE </FISHINGLEGAL> 
    <DIET> 
     <DIETITEM> Algae </DIETITEM> 
     <DIETITEM> Sea Plants </DIETITEM> 
    </DIET> 
    <EDIBLE> FALSE </EDIBLE> 
    <SCS-NAME> Holacanthus ciliaris </SCS-NAME> 
</FISH> 
+0

Ваш скрипт работает для меня при вводе статических значений. Вы уверены, что ваши имена POST верны? Также не уверен, что вы ожидаете использовать '$ условный' в будущем, но текущий код у него ничего не будет. – chris85

ответ

2

Из вашего вывода $varsPassed массив явно не содержит то, что вы ожидаете. Чтобы отлаживать, я бы сделал print_r($_POST); в верхней части файла, чтобы узнать, являются ли значения сообщений ожидаемыми. Затем, возможно, print_r($varsPassed); после создания этого массива, чтобы убедиться, что он заполнен, как ожидалось.

Кстати, ваша функция addToCond() пытается добавить значения к переменной, не входящей в объем функции, $conditional. Вы должны изменить функцию, чтобы либо вернуть значение, которое добавляется к $conditional в вызывающем коде, либо передать по ссылке $conditional в функцию.