XPath ile PHP SimpleXML

2 Cevap php

Şöyle bir XML yapısı vardır:

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

Ben bir $response dizideki değerleri eşleşen cevapları için <responses> değerlerini artırmak istiyoruz. İşte $response dizisi yapılandırılmıştır nasıl:

$response = array(
  'sid' => session_id(),
  'answers' => array(
    $_POST['input1'],
    $_POST['input2'],
    ...
  )
);

Ben anket xml dosyası için $results adında bir SimpleXMLElement var. İşte bu konuda gidiyorum nasıl:

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

Benim sonuç $r değerini artmasından sonra kaydedilmiyor. Herhangi bir yanlış yapıyorum üzerinde fikir? Teşekkürler!

2 Cevap

Birkaç hata çalışmıyor açıklıyor, komut vardır. İlk olarak, $response dizisi doğru görünmüyor. Eğer really tuşları yerine değişkenleri kullanmak niyetinde mi? print_r($response); deneyin ve ne istediğinizi gerçekten olup olmadığını görmek.

Sen gibi dizi gösterimini (0-tabanlı) kullanarak nth <question/> seçebilirsiniz

$results->question[$i]

Eğer doğru soruyu olsun, yapmanız gereken tüm bu gerçekten XPath ile önerilen cevabı içermiyor doğrulayın olduğunu. Daha sonra sadece yapabilirsiniz increment değeri <responses/>. Ayrıca, sizin XPath sorgusu başarısız yapar gibi < veya " gibi özel karakterleri, kaçmak zorunda.

Son olarak, asXML() aslında dosyayı kaydetmek için (hayır file_put_contents() burada gerekli.) Ben senin $surveyResults bir yazım hatası olduğunu varsayalım ve {[geliyordu kullanabilirsiniz (3)]}.

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

Bir sorun bu olabilir:

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

Eğer tek tırnak kullanıyorsanız bu yana, XPath experssion de değişkenler, değerlendirilmektedir değil bunun yerine kelimenin tam anlamıyla işlenmiş oluyor ('karakter, gerçek İngilizce adı "tek tırnak" Bu nedir?). Normal tırnak (") ile tek tırnak değiştirin ve değişkenlerin normal işlenecektir.

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