Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
simplexml [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
simplexml


 
jens2
27-03-2008, 15:50 
 
Hallo zusammen.

Kennt sich jemand mit simplexml aus?
Dies gibt es ab PHP5, womit ich auch arbeite.
Damit kann ich ein XML Dokument in ein simplexmlobject transferieren.

Mein Problem ist folgendes:
Ich möchte eine XML dynmisch auswerten und dessen Knotenpunkte ab einem bestimmten Knoten mit dessen Wert in ein Array packen. Die Anzahl und Namen der Knotenpunkte kenn ich nicht.

XML:

<root>
<?xml version="1.0" encoding="utf-8"?>
<root>
<formFields>
<field>
<name>
vorname
</name>
<errorMessage>
Value Vorname is Wrong!
</errorMessage>
<validation>
<length_min>
2
</length_min>
<length_max>
30
</length_max>
<alpha/>
<number/>
<test1/>
</validation>
</field>
<field>
<name>
nachname
</name>
<errorMessage>
Value Nachname is Wrong!
</errorMessage>
<validation>
<length_min>
2
</length_min>
<length_max>
40
</length_max>
<alpha/>
<number/>
<test2/>
</validation>
</field>
<field>
<name>
Ort
</name>
<errorMessage>
Value Ort is Wrong!
</errorMessage>
<validation>
<length_min>
2
</length_min>
<length_max>
50
</length_max>
<alpha/>
<number/>
<test3/>
</validation>
</field>
</formFields>
</root>



PHP:

$xmlPath = dirname(__FILE__)."\\test.xml";
$objXML = @simplexml_load_file($xmlPath); //@ = Hide PHP Warnings for this function

$formFields[] = array();
$validateClasses[] = array();
$i = 0; //count var
$j = 0; //count var, too


if(is_object($objXML)) {
//$objXML is an object!

//all childs from the formFields Node
foreach($objXML->formFields->field as $field) {
//echo "<br><br><b>FormFeld Name:</b> " . $field->name;
$formFields[$i][name] = $field->name;
//echo "<br><b>FormFeld errorMessage:</b> " . $field->errorMessage;
$formFields[$i][errorMessage] = $field->errorMessage;

//get all validation child nodes -> classes
foreach($field->validation->children() as $field2) {
//echo "<br><b>Name des Validation-Kind-Knotens:</b> " . $field2->getName();
$validateClasses[$j][$field2->getName()] = $field2;
$j++;
}$j=0;

$formFields[$i][validation] = $validateClasses;
$i++;
echo "<br><br>";
}
}else {
echo "<br>XML konnte nicht geladen werden!";
}
echo "<pre>"; print_R($formFields); echo "</pre>";


Wenn man sich das Ergebnis im Browser anschaut, dann sieht man eine Struktur des Arrays. Dies schaut folgendermaßen aus:


Array
(
[0] => Array
(
[name] => SimpleXMLElement Object
(
[0] =>
vorname

)

[errorMessage] => SimpleXMLElement Object
(
[0] =>
Value Vorname is Wrong!

)

[validation] => Array
(
[0] => Array
(
[length_min] => SimpleXMLElement Object
(
[0] =>
2

)

)

[1] => Array
(
[length_max] => SimpleXMLElement Object
(
[0] =>
30

)

)

[2] => Array
(
[alpha] => SimpleXMLElement Object
(
)

)

[3] => Array
(
[number] => SimpleXMLElement Object
(
)

)

[4] => Array
(
[test1] => SimpleXMLElement Object
(
)

)

)

)

[1] => Array
(
[name] => SimpleXMLElement Object
(
[0] =>
nachname

)

[errorMessage] => SimpleXMLElement Object
(
[0] =>
Value Nachname is Wrong!

)

[validation] => Array
(
[0] => Array
(
[length_min] => SimpleXMLElement Object
(
[0] =>
2

)

)

[1] => Array
(
[length_max] => SimpleXMLElement Object
(
[0] =>
40

)

)

[2] => Array
(
[alpha] => SimpleXMLElement Object
(
)

)

[3] => Array
(
[number] => SimpleXMLElement Object
(
)

)

[4] => Array
(
[test1] => SimpleXMLElement Object
(
)

[test2] => SimpleXMLElement Object
(
)

)

)

)

[2] => Array
(
[name] => SimpleXMLElement Object
(
[0] =>
Ort

)

[errorMessage] => SimpleXMLElement Object
(
[0] =>
Value Ort is Wrong!

)

[validation] => Array
(
[0] => Array
(
[length_min] => SimpleXMLElement Object
(
[0] =>
2

)

)

[1] => Array
(
[length_max] => SimpleXMLElement Object
(
[0] =>
50

)

)

[2] => Array
(
[alpha] => SimpleXMLElement Object
(
)

)

[3] => Array
(
[number] => SimpleXMLElement Object
(
)

)

[4] => Array
(
[test1] => SimpleXMLElement Object
(
)

[test2] => SimpleXMLElement Object
(
)

[test3] => SimpleXMLElement Object
(
)

)

)

)

)

 
unset
27-03-2008, 15:54 
 
Nicht umsonst steht da, dass es sich teilweise um Arrays und teilweise um Objekte handelt.

 
jens2
27-03-2008, 15:55 
 
Frage 1:
Warum macht er zwischen name und wert ein Ebene?
"[name] => SimpleXMLElement Object
(
[0] =>
vorname" ???
Wenn ich "$formFields[0][name]" ausgebe, bekomm ich den Namen.
Wenn ich "$formFields[0][name][0]" ausgebe, bekomm ich den Namen auch.
Warum gibt er nicht "[name] => vorname" aus?

Frage 2:
$formFields[0][validation] ist ein Array, stimmt auch.
$formFields[0][validation][0] sollte nun der 1. Knoten in dem Knoten Validation sein. Ist aber auch ein Array, selbe Problem wie Frage 1.
$formFields[0][validation][0][0] sollte dann aber laut debug "length_min" sein, aber er gibt nix aus.

Ich hoffe ihr versteht mein Problem, den Langsam blicke ich net mehr druch. Vielleicht habe in PHP und Arrays auch was falsch verstanden. Ich wäre für jeden Tipp dankbar.

Gruß Jens2

 
jens2
27-03-2008, 15:57 
 
Hallo unset.

Danke für deine Antwort. Gibt es vielleicht eine andere Möglichkeit
eine sauberes Array zu erzeugen? Denn es soll ja später dynmisch in jedes Feld gehen und dessen Infos extrahieren.

Gruß Jens2

 
unset
27-03-2008, 15:58 
 
Wer? Das Array? Das kann es alleine schon mal gar nicht. Ich weiß auch nicht, wo das Problem ist zu prüfen, ob es sich um ein Array oder ein Objekt handelt und das ganze entsprechend abzuarbeiten.

 
jens2
27-03-2008, 16:02 
 
Das Problem ist, das ich nicht die werte des validation Arrays ausgeben kann.

$formFields[0] = Nr des feldes "field"
$formFields[0][name] ODER $formFields[0][0] soll den namen ausgeben->stimmt;
$formFields[0][validation][0] soll mir "length_min" ausgeben, und da scheiter ich dran.

 
jahlives
27-03-2008, 16:09 
 
@Jens2
Bitte noch die Regeln bezüglich Formatierung von Quellcode nachlesen und umsetzen (zumindest für den PHP-Teil deines Codes).
Danke und Gruss

tobi

 
jens2
27-03-2008, 17:50 
 
Danke für Eure Hilfe.
Habe das Problem gelöst.
Danke nochmal an Unset.

Gruß Jens2

 
PHP-Desaster
27-03-2008, 21:20 
 
Trag doch bitte für die Nachwelt noch deine Lösung bzw. Erkenntnis nach ;)

 
jens2
28-03-2008, 13:49 
 
Ich habe bei der Wertzuweisung einen leeren String mitgegeben
also $test = "".$array[index][bla][blub];
Dadurch war das simplexml_object weg und keine leerzeilen mehr da.


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:31 Uhr.