2016-09-23 3 views
0

Ich versuche, mit XML wie diese Probe zu arbeiten:Wie bekomme ich einen bestimmten Knoten in XML nach einem anderen Knotenwert mit PHP?

<?xml version="1.0"?> 
<quizReport version="1" xsi:schemaLocation="http://www.ispringsolutions.com/ispring/quizbuilder/quizresults quizReport.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.ispringsolutions.com/ispring/quizbuilder/quizresults"> 
<quizSettings timeLimit="0" maxNormalizedScore="100" maxScore="20" quizType="graded"> 

<passingPercent>0.6</passingPercent> 
</quizSettings> 
<summary time="4" percent="0.5" score="10"> 
<variables> 
    <variable title="Nom" value="test1411" name="USER_NAME"/> 

    <variable title="Courriel" value="" name="USER_EMAIL"/> 
</variables> 
</summary> 


<questions> 
<trueFalseQuestion usedAttempts="1" awardedPoints="10" maxAttempts="1" maxPoints="10" status="correct" id="{11AD6662-ACF3-4C2B-A3E6-04311C0DD8DB}"> 
<direction>Le mot de passe de votre compte iNews est indépendant de votre mot de passe radiocanadien géré par ActiveDirectory. </direction> 
<answers userAnswerIndex="0" correctAnswerIndex="0"> 
<answer>Vrai </answer> 
<answer>Faux </answer> 
</answers> 
</trueFalseQuestion> 

<trueFalseQuestion usedAttempts="1" awardedPoints="0" maxAttempts="1" maxPoints="10" status="incorrect" id="{F13CF7F1-C830-41AF-A54C-CE78EE383611}"> 
<direction>Le protocole FTP permet de reprendre un transfert de fichier qui a été arrêté, sans recommencer le transfert depuis le début. </direction> 
<answers userAnswerIndex="1" correctAnswerIndex="0"> 
<answer>Vrai </answer> 
<answer>Faux </answer> 
</answers> 
</trueFalseQuestion> 
</questions> 
</quizReport> 

Jede Frage ein ID-Attribut hat, z.B. {11AD6662-ACF3-4C2B-A3E6-04311C0DD8DB}. Der Status der Frage wird als Text zurückgegeben (d. H. richtig oder inkorrekt).

Mein Ziel ist es, jeden Fragenstatus zu extrahieren und in eine Datenbank einzufügen, in der eine Spalte mit derselben Frage-ID versehen ist (ich bin mit MySQL INSERT vertraut).

Ich habe viele Lösungen versucht (xPath, foreach ...) und ich kann kein Stück Code zum Arbeiten bekommen. Alle meine Bemühungen wurden mit SimpleXMLElement gemacht.

Also, am Ende werde ich den Wert richtig oder falsche in die DB unter einer Säule mit Frage-ID (zB {11AD6662-ACF3-4C2B-A3E6-04311C0DD8DB}) für jeden markiertes einfügen einzelne Frage des XML (die bis zu 100 Fragen enthalten kann). Es wird also eine Art Schleife durch das XML benötigt.

Ich muss darauf hinweisen, dass der Tag-Name truFalseQuestion je nach Art der Frage ändern kann (eine andere Frage könnte zum Beispiel multipleChoiceQuestion sein). Ich habe dieses einfache XML erstellt, um mir Schritt für Schritt verständlich zu machen.

+0

* unter einer Spalte mit der Bezeichnung {11AD6662-ACF3-4C2B-A3E6-04311C0DD8DB} * ... Ich bezweifle, dass MySQL einen solchen Feldnamen zulässt. Du meintest wahrscheinlich ein anderes Feld als * questionid * und dies als Wert. – Parfait

+1

Ich denke, dieser Ansatz erfordert, dass Sie weitere Metadaten hinzufügen, um die möglichen Frage-Tag-Namen aufzulisten. – bassxzero

Antwort

0

Sie können die PHP SimpleXML library verwenden, um die XML-Analyse für Sie zu verarbeiten. z.B .:

//presuming that xml data is stored in $xmlContents 
$xmlData = new SimpleXMLElement($xmlContents); 
$keys = get_object_vars($xmlData); 
$aValues = array(); 
foreach($keys as $key=>$property) { 
    if (stripos($key,'questions')!== false) {  
     foreach($property as $questionType=>$question) { 
      $aValues[] = "('".(string)$question['id']."','".(string)$question['status']."')"; 
     } 
    } 
} 
if (count($aValues)) { 
    //presumed table and columns - modify per your names - this is a sample SQL statement - if you are using a different database variant, modify accordingly 
    $query = 'INSERT INTO questionStatus (questionId,status) VALUES ' .  implode(',',$aValues); 
    print($query); 
    //@TODO: run insert statement with your database layer code 
} 

Ausgang mit Ihren Daten:

INSERT INTO questionStatus (questionId,status) VALUES ('{11AD6662-ACF3-4C2B-A3E6-04311C0DD8DB}','correct'),('{F13CF7F1-C830-41AF-A54C-CE78EE383611}','incorrect') 
+0

Wie löst dies die verschiedenen Fragetypen Problem? – bassxzero

+0

In der Tat, OP erwähnt * multipleChoiceQuestion * als ein potenzielles Element unter, wer weiß wie viele andere! Wir sollten auf die Antwort von @ bassxzero's Kommentar warten. – Parfait

+0

Ja, wir können ['get_object_vars()'] (http://php.net/manual/en/function.get-object-vars.php) um die Eigenschaften zu finden, die 'Fragen' enthalten - hoffentlich wird das genügen? –

0

Sie durch alle untergeordneten Knoten des Fragen-Element laufen konnte.

Der Tagname jedes untergeordneten Knotens kann mit der Funktion getName() gefunden werden.

Hier ist ein Beispielcode. Ich hoffe, es kann dir helfen, eine Idee zu bekommen.

<?php 
//if your XML is stored in a file named "test.xml", you can load it from there. 
//Otherwise try simplexml_load_string($xmlstring) 
$file=simplexml_load_file("test.xml"); 

//get the questions 
$questions=$file->questions->children(); 
foreach($questions as $question) { 

    //as a sample there is some data printed for each question. 
    print "QuestionType: ". $question->getName()."\n"; 
    print "QuestionID: ". $question->attributes()->id."\n"; 
    print "Direction: ".(string) $question->direction."\n"; 
    print "\n"; 
    print "Answers: \n"; 
    foreach($question->answers->answer as $answer){ 
     print (string)$answer."\n"; 
    } 

    print "\n\n"; 
} 

[EDIT]

es so etwas wie dies druckt:

 
QuestionType: trueFalseQuestion 
QuestionID: {11AD6662-ACF3-4C2B-A3E6-04311C0DD8DB} 
Direction: Le mot de passe de votre compte iNews est indépendant de votre mot de passe radiocanadien géré par ActiveDirectory. 

Answers: 
Vrai 
Faux 


QuestionType: trueFalseQuestion 
QuestionID: {F13CF7F1-C830-41AF-A54C-CE78EE383611} 
Direction: Le protocole FTP permet de reprendre un transfert de fichier qui a été arrêté, sans recommencer le transfert depuis le début. 

Answers: 
Vrai 
Faux 

[/ EDIT]

Edit2: die ID zu dem Beispielcode und Beispielausgabe

Hinzugefügt
+0

Auf Stack Overflow wird der Revisionsverlauf jedes Posts tatsächlich gespeichert. Daher müssen Sie nicht angeben, dass Sie nach der Veröffentlichung etwas hinzugefügt haben - jeder kann sehen, was jede Änderung geändert hat, indem Sie auf "Bearbeitete X Sekunden/Minuten/Stunden/Tage/etc." Text. – dorukayhan

+0

Oh danke! Ich habe das noch nicht gesehen. – akrys

+0

Ich habe meinen Code in '$ xmlData = new SimpleXMLElement ($ fichierxml); foreach ($ xmlData-> Fragen-> trueFalseQuestion als $ -Frage) { $ questionid = (string) $ question ['id']; $ quesstatus = (string) $ question ['status']; \t $ sql = "INSERT INTO test_xml_questions ($ questionid) WERTE ('$ questionsstatus')"; } 'aber nichts ist in den DB eingefügt ... Meine Spalten sind als ** {11AD6662-ACF3-4C2B-A3E6-04311C0DD8DB} ** und ** {F13CF7F1-C830-41AF-A54C-CE78EE383611} ** gekennzeichnet. Sind die Auszeichnungen illegale Charaktere? – Clitorio

Verwandte Themen