带有XPath的PHP SimpleXML

时间:2010-01-22 19:52:59

标签: php xpath simplexml

我的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'],
    ...
  )
);

我的调查xml文件中有一个名为$results的SimpleXMLElement。以下是我的意思:

$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 个答案:

答案 0 :(得分:2)

您的脚本中存在多个错误,这可以解释为什么它不起作用。首先,您的$response数组似乎不正确。你真的打算用变量代替键吗?试试print_r($response);,看看它是不是你想要的。

您可以使用数组表示法(基于0)选择第n个<question/>,如

$results->question[$i]

一旦得到正确的问题,您需要做的就是验证它确实包含XPath的建议答案。然后,您可以increment <responses/>的值{{3}}。此外,您必须转义特殊字符,例如<",这会使您的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);

答案 1 :(得分:0)

可能有一个问题:

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

由于您使用的是单引号('-character,实际的英文名称是“单引号”?),因此不会对XPath experssion中的变量进行求值,而是按字面处理。用正常引号(“)替换单引号,变量将正常处理。

请参阅:http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.single