2010-01-22 99 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