2010-01-22 3 views
2

У меня есть структуру XML, которая выглядит следующим образом:PHP SimpleXML с XPath

<?xml version="1.0"?> 
<survey> 
    <responses>0</responses> 
    <question> 
    <title>Some survey question</title> 
    <answer> 
     <title>Answer 1</title> 
     <responses>0</responses> 
    </answer> 
    <answer> 
     <title>Answer 2</title> 
     <responses>0</responses> 
    </answer> 
    ... 
    </question> 
    ... 
</survey> 

Я хочу, чтобы увеличить <responses> значения для ответов, которые соответствуют значениям в $response массиве. Вот как структурирован $response массива:

$response = array(
    'sid' => session_id(), 
    'answers' => array(
    $_POST['input1'], 
    $_POST['input2'], 
    ... 
) 
); 

У меня есть SimpleXMLElement называется $results для моего файла обследование XML. Вот как я собираюсь об этом:

$results = simplexml_load_file($surveyResultsFile); 

$i = 1; 
foreach($response->answers as $answer) { 
    $r = $results->xpath("question[$i]/answer[title='$answer']/responses"); 
    $r = $r[0]; 
    $r = intval($r) + 1; 
    $i++; 
} 

file_put_contents($surveyResultsFile, $results->asXML()); 

Мои результаты не сохраняются после увеличения значения $r. Любые идеи о том, что я делаю неправильно? Благодаря!

ответ

2

Есть несколько ошибок в вашем скрипте, что объясняет, почему он не работает Во-первых, ваш $response массив не кажется правильным. Возможно, вы имели действительно намерены использовать переменные вместо ключей? Попробуйте print_r($response); и посмотреть, если это действительно то, что вы хотите.

вы можете выбрать энный <question/> с использованием нотации массивов (0 на основе), как в

$results->question[$i] 

Как только вы получите правильный вопрос, все, что вам нужно сделать, это проверить, что он действительно содержит предлагаемый ответ с XPath. Тогда только, вы можете increment значение <responses/>. Кроме того, вам нужно избежать специальных символов, таких как < или ", что приведет к сбою запроса XPath.

Наконец, вы можете использовать asXML() на самом деле сохранить файл (не file_put_contents() не нужны.) Я предполагаю, что ваш $surveyResults опечатка и что вы имели в виду $surveyResultsFile.

$response = array(
    'sid'  => session_id(), 
    'answers' => array(
     $_POST['input1'] 
    ) 
); 

$results = simplexml_load_file($surveyResultsFile); 

foreach ($response['answers'] as $i => $answer) { 
    $title = htmlspecialchars($answer); 
    $a = $results->question[$i]->xpath('answer[title="' . $title . '"]'); 

    if (empty($a)) 
    { 
     echo "No answer '$title' for question $i\n"; 
     continue; 
    } 
    ++$a[0]->responses; 
} 

$results->asXML($surveyResultsFile); 
+0

Спасибо! Ключами массива '$ response', являющимися переменными, была опечатка, как и' $ surveyResults' вместо '$ surveyResultsFile' в конце. Мне определенно нужно изучить XPath и SimpleXML больше, так как это мой первый раз, используя их. – Jared

0

Одна проблемы может быть в этом:

$r = $results->xpath('/question[$i]/answer[title=$answer]/responses'); 

Поскольку вы используете одинарные кавычки («? -character, является фактическим английским названием„апостроф“), переменные в XPath experssion Арен» t оценивается, а обрабатывается буквально. Заменить одинарные кавычки с нормальными кавычки (") и переменные будут обработаны нормально

См:.. http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.single

+1

Вы также должны пометить строку (литерал) для xpath кавычками 'title = '$ answer''. Если $ answer может содержать кавычки, вы должны заменить их на их представление сущности, то есть ' (или " в зависимости от того, какие цитаты вы выбрали для маркирования строкового литерала) – VolkerK

+0

Я внесла изменения, а также удалил первую косую черту, которая была вызывая проблемы. Я могу успешно увеличить значение '$ r' сейчас, но изменения не сохраняются в XML-файле. – Jared

Смежные вопросы