带有XPath的PHP SimpleXML - php

我有一个看起来像这样的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的值后,不会保存我的结果。关于我在做什么错的任何想法吗?谢谢!

参考方案

脚本中有几个错误,这说明了为什么它不起作用。首先,您的$response数组看起来不正确。您是否真的打算使用变量代替键?尝试print_r($response);看看它是否真的是您想要的。

您可以使用数组符号(从0开始)选择第n个<question/>

$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);

验证IBAN PHP - php

在设计新平台时,我们尝试集成IBAN编号。我们必须确保IBAN已经过验证,并且存储在数据库中的IBAN始终正确。那么验证数字的正确方法是什么? 参考方案 正如我在其他问题中解释的逻辑一样,我尝试自己创建一个函数。根据Wikipedia文章中解释的逻辑,在下面找到合适的功能。国家特定验证。它适合吗http://en.wikipedia.org/wiki/Int…

PHP PDO组按列名称查询结果 - php

以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

通过>和<运算符比较日期 - php

在我的所有php代码中,我都在UTC中存储日期和时间,但是我也在使用mysql存储日期时间(也在utc中)。大于和小于运算符会导致日期比较失败吗? $curdate=date('Y-m-d H:i:s'); if($start_datetime>$curdate) 参考方案 不。他们没有办法失败。为此,特意制作了MySQL日期格式。…

我如何在Safari浏览器中支持<video>? - php

我想在野生动物园浏览器中显示视频,当我刷新浏览器时,什么也没有发生,该怎么办?这是我的代码:<!doctype html> <html> <head> <title>Simple Movie Player</title> </head> <body> <video sr…