2010-01-22 105 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);,看看它是否是你想要真正的东西。

您可以选择的第n个<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 2010-01-23 22:29:48

0

一个问题可能是这样的:

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

由于您使用单引号(即“?字符数限制,是实际的英文名‘单引号’),在XPath表达研究的变量AREN” t正在评估,而是直接进行处理。替换单引号与正常引号(“)和变量将被正常处理

。见:http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.single

+1

您还需要用引号'title ='$ answer''来标记xpath的字符串(文字)。如果$答案都不可能包含引号,你必须通过自己的实体表示来取代它们,即'(或"这取决于引用您选择标记字符串文字) – VolkerK 2010-01-22 21:34:56

+0

我所做的更改,以及删除这是第一个斜杠造成问题。现在我可以成功增加'$ r'的值,但更改不会保存到XML文件中。 – Jared 2010-01-22 23:28:13