PHP SimpleXML с XPath - PullRequest
       22

PHP SimpleXML с XPath

2 голосов
/ 22 января 2010

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

<?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 ]

2 голосов
/ 24 января 2010

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

Вы можете выбрать nth <question/>, используя обозначение массива (на основе 0), как в

$results->question[$i]

Как только вы получите правильный вопрос, все, что вам нужно сделать, это убедиться, что он действительно содержит предложенный ответ с XPath. Только тогда вы можете увеличить значение <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 голосов
/ 22 января 2010

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

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

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

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

...