Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML][PHP]Pobranie danych ze skomplikowanego XML
Forum PHP.pl > Forum > Przedszkole
zaworek
Witam.
Mam problemy z pobraniem danych w elemencie potomnym <questions> sekcja CDATA. Są tam 4 pytania oraz odpowiedzi, które chciałbym wyodrębnić i finalnie wysłać do bazy.
Korzystając z DOM (kod niżej)

  1. $dom = new DOMDocument();
  2. $dom->load('wynik.xml');
  3. $dom->preserveWhiteSpace = false;
  4. $dana = $dom->getElementsByTagName('questions');
  5. foreach ($dana as $i) {
  6. echo $i->nodeValue, PHP_EOL;
  7. }


otrzymuje
Kod
Pytanie1Odpowiedz1Odpowiedz2Odpowiedz3Pytanie4Odp1Odp2Odp3Pytanie3PrawdaFałszPyt
anie2Multi_odp1Multi_odp2Multi_odp3Multi_odp4


Czy ktoś mógłby mnie naprowadzić jak powinna wyglądać składnia aby uzyskać to o co pytam?

Plik xml ma postać:
  1. <quiz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><quizSettings quizType="graded" maxScore="100" maxNormalizedScore="100" timeLimit="1200"><passingPercent>70</passingPercent></quizSettings><summary score="50" percent="50" time="9" finishTimestamp="1 kwietnia 2022 13:41" passed="false"><variables><variable name="USER_NAME" title="login" value="xyz"/></variables></summary><questions><multipleChoiceQuestion id="j2vzvoypej24" status="correct" evaluationEnabled="true" maxPoints="25" maxAttempts="1" awardedPoints="25" usedAttempts="1"><direction><text><![CDATA[Pytanie1]]></text></direction><answers correctAnswerIndex="0" userAnswerIndex="0"><answer><text><![CDATA[Odpowiedz1]]></text></answer><answer><text><![CDATA[Odpowiedz2]]></text></answer><answer><text><![CDATA[Odpowiedz3]]></text></answer></answers></multipleChoiceQuestion><multipleChoiceQuestion id="k5afxylfcy93" status="incorrect" evaluationEnabled="true" maxPoints="25" maxAttempts="1" awardedPoints="0" usedAttempts="1"><direction><text><![CDATA[Pytanie4]]></text></direction><answers correctAnswerIndex="1" userAnswerIndex="2"><answer><text><![CDATA[Odp1]]></text></answer><answer><text><![CDATA[Odp2]]></text></answer><answer><text><![CDATA[Odp3]]></text></answer></answers></multipleChoiceQuestion><trueFalseQuestion id="lvyggjalsr9g-jn6ftz1phcoo" status="correct" evaluationEnabled="true" maxPoints="25" maxAttempts="1" awardedPoints="25" usedAttempts="1"><direction><text><![CDATA[Pytanie3]]></text></direction><answers correctAnswerIndex="0" userAnswerIndex="0"><answer><text><![CDATA[Prawda]]></text></answer><answer><text><![CDATA[Fałsz]]></text></answer></answers></trueFalseQuestion><multipleResponseQuestion id="yqb2r4lrnqz8" status="incorrect" evaluationEnabled="true" maxPoints="25" maxAttempts="1" awardedPoints="0" usedAttempts="1"><direction><text><![CDATA[Pytanie2]]></text></direction><answers><answer correct="true" selected="false"><text><![CDATA[Multi_odp1]]></text></answer><answer correct="true" selected="true"><text><![CDATA[Multi_odp2]]></text></answer><answer correct="true" selected="true"><text><![CDATA[Multi_odp3]]></text></answer><answer correct="true" selected="false"><text><![CDATA[Multi_odp4]]></text></answer></answers></multipleResponseQuestion></questions></quiz>
trueblue
I to poprawny wynik.
Musisz wyłuskać z <questions> -> <direction><text> oraz z <answers> -> <answer><text>
zaworek
Cytat(trueblue @ 1.04.2022, 15:05:14 ) *
I to poprawny wynik.
Musisz wyłuskać z <questions> -> <direction><text> oraz z <answers> -> <answer><text>


Dziękuje za podpowiedź. Udało mi się pobrać w pętli pytania i odpowiedzi.

  1. //pytania
  2. $question = $dom->getElementsByTagName('direction');
  3. foreach ($question as $pyt)
  4. {
  5. echo $pyt->nodeValue;
  6. }
  7.  
  8. //odpowiedzi
  9. $answer = $dom->getElementsByTagName('answer');
  10. foreach ($answer as $odp)
  11. {
  12. echo $odp->nodeValue;
  13. }


Pozostało jeszcze wyłuskać która odpowiedź jest poprawna i jaka faktycznie została zaznaczona. Rozumiem, że trzeba dobrać się do atrybutu w elemencie <answers>?
Kod
<answers correctAnswerIndex="0" userAnswerIndex="0">
trueblue
Tak.

Czy jesteś w stanie korzystając ze swojego kodu dopasować odpowiedzi do pytań?
zaworek
Cytat(trueblue @ 4.04.2022, 09:00:30 ) *
Tak.

Czy jesteś w stanie korzystając ze swojego kodu dopasować odpowiedzi do pytań?


Na ten moment nie jestem.

Na razie skupiłem się na samym wyodrębnieniu danych o których wspominałem na początku. Wygląda, że część potrzebnych informacji trzymana jest w elemencie <answer> a inne w <answers>.
Poniższe wyświetla index odpowiedzi dla części z pytań. Czy ten zapis jest poprawny?

  1. $choice = $dom->getElementsByTagName('answers');
  2. foreach ($choice as $wybor)
  3. {
  4. echo $wybor->getAttribute('correctAnswerIndex').'<br>';
  5. echo $wybor->getAttribute('userAnswerIndex').'<br>';
  6. }
trueblue
Informacje o poprawnej odpowiedzi zależą od typu pytania:
<multipleChoiceQuestion>
<trueFalseQuestion>
<multipleResponseQuestion>
Być może typów jest więcej.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.