Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [XML][PHP]Pobranie danych ze skomplikowanego XML
zaworek
post 1.04.2022, 13:42:18
Post #1





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 27.06.2006

Ostrzeżenie: (0%)
-----


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>


Ten post edytował zaworek 1.04.2022, 13:44:49
Go to the top of the page
+Quote Post
trueblue
post 1.04.2022, 14:05:14
Post #2





Grupa: Zarejestrowani
Postów: 6 799
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


I to poprawny wynik.
Musisz wyłuskać z <questions> -> <direction><text> oraz z <answers> -> <answer><text>


--------------------
Go to the top of the page
+Quote Post
zaworek
post 4.04.2022, 07:35:17
Post #3





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 27.06.2006

Ostrzeżenie: (0%)
-----


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


Ten post edytował zaworek 4.04.2022, 07:35:53
Go to the top of the page
+Quote Post
trueblue
post 4.04.2022, 08:00:30
Post #4





Grupa: Zarejestrowani
Postów: 6 799
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Tak.

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


--------------------
Go to the top of the page
+Quote Post
zaworek
post 4.04.2022, 09:29:04
Post #5





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 27.06.2006

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post
trueblue
post 4.04.2022, 09:42:06
Post #6





Grupa: Zarejestrowani
Postów: 6 799
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Informacje o poprawnej odpowiedzi zależą od typu pytania:
<multipleChoiceQuestion>
<trueFalseQuestion>
<multipleResponseQuestion>
Być może typów jest więcej.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.06.2025 - 17:03