simplexml_load_file
pahe
- php
Hi,
Was ich machen möchte:
XML einlesen und in die Attribute(<name></name>) Werte in einem input feld ausgeben.
Bsp:
<?php $xml->modul[0]->wert1[0] = $_POST['wert1']; ?>
<<b>wert1</b>><input type="text" name="wert1" size="20" value="<?php echo $xml->modul->wert1[0]; ?>" /><<b>/wert1</b>>
Einlesen und editieren funktioniert!
Aber nur wenn ich die Attribute im php code festlege!
Frage/Problem:
Wie kann ich auf ein XML Attribute zugreifen??
Ich bin schon ganz verwirrt vor lauter Array/String/XML
mit simplexml_load_file bekomme ich XML? Also kein Array oder String
Sehe ich das richtig?
hab auch schon mit var_dump rumgedoctort aber geklappt hat es nicht.
Am besten(am einfachsten für mich) wäre es jedes Attribut in eine variable zuspeichern!
Hoffe jemand kann mich aufklären wie ich vorgehen soll.
demo:
http://pahe.de/module/xml/xml.php
code:
<head>
</head>
<body>
HOW To SAVE A XML!<br>
<br>
<?php
/* >>>>>> HIGHLIGHTER */
$f_open = "<<font color=\"#990099\">\n";
$f_close = "</font>><br>\n";
$fehler = "<<font color=\"#cc0000\"><b>FEHLER|></font></b>\n";
/* <<<<<< HIGHLIGHTER */
/* >>>>>> XML LADEN */
$filename = 'menu.xml';
$savefile = 'menu.xml';
$xml = simplexml_load_file('menu.xml');
/* <<<<<< XML LADEN */?>
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<<b>modul</b>>
<br>
<?php $xml->modul[0]->wert1[0] = $_POST['wert1']; ?>
<<b>wert1</b>><input type="text" name="wert1" size="20" value="<?php echo $xml->modul->wert1[0]; ?>" /><<b>/wert1</b>>
<br><br>
<?php $xml->modul[0]->wert2[0] = $_POST['wert2']; ?>
<<b>wert2</b>><input type="text" name="wert2" size="20" value="<?php echo $xml->modul->wert2[0]; ?>" /><<b>/wert2</b>>
<br>
<<b>/modul</b>>
<br>
<input type="submit" name="view" value="Vorschau" />
<input type="submit" name="save" value="Speichern" />
</form>
<?php
/* !SPEICHERN! */
if ($_POST['save']=="Speichern"){
echo "Speichern";
$xml->asXML($savefile);
}
/* <<<<<< VORSCHAU - SPEICHERN */
?>
</body>
sry->
Wie kann ich auf ein XML Attribute zugreifen >>DAS ICH NICHT KENNE<<????
Hi,
Was ich machen möchte:
XML einlesen und in die Attribute(<name></name>) Werte in einem input feld ausgeben.
<name> wäre kein Attribut, sondern ein Tag.
Und name wäre dann folglich ein Element in deinem XML.
mit simplexml_load_file bekomme ich XML? Also kein Array oder String
Sehe ich das richtig?
Du bekommst ein SimpleXML-Objekt.
Hoffe jemand kann mich aufklären wie ich vorgehen soll.
MfG ChrisB
Hi,
Was ich machen möchte:
XML einlesen und in die Attribute(<name></name>) Werte in einem input feld ausgeben.<name> wäre kein Attribut, sondern ein Tag.
Und name wäre dann folglich ein Element in deinem XML.mit simplexml_load_file bekomme ich XML? Also kein Array oder String
Sehe ich das richtig?Du bekommst ein SimpleXML-Objekt.
Hoffe jemand kann mich aufklären wie ich vorgehen soll.
MfG ChrisB
Danke,
Wie kann ich alle Elemente von einer XML Datei einlesen,
ohne die Bezeichnung der Elemente zukennen.
Um dann jedes Element in einer Variablen speichern.
Hallo Pahe
kennst Du foreach?
Hier gibt es sogar ein Beispiel:
traversieren
Gruß
der Sascha
Hi,
Was ich machen möchte:
XML einlesen und in die Attribute(<name></name>) Werte in einem input feld ausgeben.<name> wäre kein Attribut, sondern ein Tag.
Und name wäre dann folglich ein Element in deinem XML.mit simplexml_load_file bekomme ich XML? Also kein Array oder String
Sehe ich das richtig?Du bekommst ein SimpleXML-Objekt.
Hoffe jemand kann mich aufklären wie ich vorgehen soll.
MfG ChrisB
Danke,
Wie kann ich alle Elemente von einer XML Datei einlesen,
ohne die Bezeichnung der Elemente zukennen.
Um dann jedes Element in einer Variablen speichern.
erstmal danke!
Ja, ich kenne foreach!
foreach ($xml->modul[0]->children() as $second_gen) {
echo $second_gen[0];}
Aber das löst mein Problem nicht!
Damit bekomme ich zwar den Inhalt Dynamisch aber nicht
das Element!
Beispiel:::
Die XML "menu.xml" Datei:
<mebuca>
<modul>
<wert1>sdfsdf</wert1>
<wert2>dsfsdfsd</wert2>
</modul>
</mebuca>
~~~>
Php:
~~~php
<?php
$filename = 'menu.xml';
$savefile = 'menu.xml';
$xml = simplexml_load_file('menu.xml');
foreach ($xml->modul[0]->children() as $second_gen) {
echo $second_gen[0];}
?>
Ausgeben bekomm ich dann:
sdfsdf
Wie kann ich mir die Elemente anzeigen lassen?
<wert1></wert1>
Hi!
Ja, ich kenne foreach!
foreach ($xml->modul[0]->children() as $second_gen) {
Anscheinend nicht gut genug, denn foreach hat eine erweiterte Syntax, die nicht nur den Wert sondern auch den Schlüssel liefert.
Lo!
Hi!
Ja, ich kenne foreach!
foreach ($xml->modul[0]->children() as $second_gen) {Anscheinend nicht gut genug, denn foreach hat eine erweiterte Syntax, die nicht nur den Wert sondern auch den Schlüssel liefert.
Lo!
Es funktioniert nicht! Hab das XML Object jetzt in einen Array Konvertiert
und arbeit damit weiter....
Danke für die links
Hi!
Es funktioniert nicht!
"Funktioniert nicht" funktioniert nicht als Fehlerbeschreibung. Damit kann man in den seltensten Fällen weiterhelfen. Wenn du hilfreiche Antworten haben möchtest, musst du schon genauer beschreiben, wie der aktuelle Stand ist.
Lo!
Hi!
»»
Es funktioniert nicht!
»»
"Funktioniert nicht" funktioniert nicht als Fehlerbeschreibung. Damit kann man in den seltensten Fällen weiterhelfen. Wenn du hilfreiche Antworten haben möchtest, musst du schon genauer beschreiben, wie der aktuelle Stand ist.
»»
»»
Lo!
Da stimme ich dir voll zu. Dies hätte ich auch getan wenn es einen Sinn gemacht hätte.
Da es hier nicht um ein Riesen Scripte geht sondern lediglich um das auslesen einer einzigen xml Objekts.
Was sollte das also bringen den Code zu Posten der falsch ist und nur aus 3-4 "Dingern"(steinigt mich) besteht.
Dann brauche ich auch kein Forum- hier den falschen Code zu Posten bis wir irgendwann etwas funktionierendes herausbekommen, damit muss ich euch nicht belasten und möchte ich auch nicht. Damit quäle ich mich dann allein durch.
xml Objekt - zugreifen = foreach
alles was ich probiert habe hat nicht funktioniert,
ich habe mir jetzt eine Funktion gegoogelt die das xml Objekt in einen Array konvertiert.
Ich habe allerdings die Vermutung das in dieser Funktion die Losung meines Problems steckt?!
Leider bin ich zu unwissend um mir das rauszuziehen was wichtig wäre, klar könnte ich mir das wissen an lesen, aber fürs erste könnt ihr mir vielleicht helfen. Will damit sagen das ich mir das wissen noch an lesen werde, da ich mir aber alles was ich kann selbst bei bringen muss. Setzte ich mir immer ein Projekt Plan dieses und Fang dann an dieses umzusetzen. Während dessen treten dann Probleme auf die ich dann nachlesen.
In diesem Fall ist es allerdings so, das es viel zu lesen gäbe, ich diesen xml reader/writer aber benötige da ich meine zukünftigen Scripte mit xml als DB dynamisch machen möchte.
Warum mache ich das so mache? Wie bereits gesagt lehre ich mich selbst und damit das dann auch Spaß macht, mache ich es so.
Was allerdings keinen Spaß macht, wenn man zu lange im Dunkeln läuft. Aber das kennt wohl jeder :)
Ich denke aber mal, finde das irgendwie logisch, das in dem Konverter die Losung steckt.
Habe jetzt mit dem Array weitergearbeitet,
schöner wäre es natürlich wenn ich mir das ersparen könnte.
Kleine zwischenfrage, gibt es eine Möglichkeit einer variablen ein wert hinzuzufügen. Also wenn ich in einer schleife etwas ausgebe sagen wir mal einen Array und ich den angegebenen wert in eine variable übergebe so würde diese am ende immer den letzten wert enthalten, Losung der variable etwas hinzufügen, eine Zahl, die sich erhöht. Also würde ich dann aus einem Array mit 3-werten 3-variablen erhalten die in etwa so aussehen könnten:
$hallo_1="welt";
$hallo_2="welten; etc.
Gibt es da eine Möglichkeit?
Der Konverter XML to Array:
/* >>>>>> XML to ARRAY */
function xml2array($fname){
$sxi = new SimpleXmlIterator($fname, null, true);
return sxiToArray($sxi);
}
function sxiToArray($sxi){
$a = array();
for( $sxi->rewind(); $sxi->valid(); $sxi->next() ) {
if(!array_key_exists($sxi->key(), $a)){
$a[$sxi->key()] = array(); }
if($sxi->hasChildren()){
$a[$sxi->key()][] = sxiToArray($sxi->current());}
else{
$a[$sxi->key()][] = strval($sxi->current());
}
}
return $a;
}
$xmlArray = xml2array($filename);
/* <<<<<< XML to ARRAY */
Hi!
Kleine zwischenfrage, gibt es eine Möglichkeit einer variablen ein wert hinzuzufügen. Also wenn ich in einer schleife etwas ausgebe sagen wir mal einen Array und ich den angegebenen wert in eine variable übergebe so würde diese am ende immer den letzten wert enthalten, Losung der variable etwas hinzufügen, eine Zahl, die sich erhöht. Also würde ich dann aus einem Array mit 3-werten 3-variablen erhalten die in etwa so aussehen könnten:
Variable Variablen haben ihren Anwendungszweck, aber wenn es darum geht, ein Array nachzubilden, sind sie keine gute Idee. Du erhältst eine Menge Variablen, von denen du nicht weißt, welche existieren. Wenn du über sie iterieren willst, musst du immer ihre Existenz abfragen. Das geht mit dem Array einfacher. Auch alle anderen Array-Funktionen sind selten auf per vV-Mechanismus angelegte Variablen anwendbar.
ich habe mir jetzt eine Funktion gegoogelt die das xml Objekt in einen Array konvertiert.
Die Funktion wandelt die XML-Struktur im Ganzen in ein varschachteltes Array um. Das halte ich im Allgemeinen für überflüssig, es sei denn, ein nachgelagerter bereits fertiges und nicht veränderbares Stück Programmcode kann nur mit solchen Arrays umgehen. Wenn es dir allein darum geht, die Kinder von <modul> mit Elementnamen und Wert zu erhalten, so ist ein einfaches foreach ausreichend.
foreach ($xml->modul[0]->children() as $elementName => $child) {
var_dump($elementName);
var_dump((string)$child);
}
Lo!
Guten Abend,
Also ich habe es jetzt zumindest soweit das ich
etwas angezeigt bekomme.
Aber ganz funktionieren tut es noch nicht!
Die XML wird gelesen und angezeigt aber nur
der erste Teil, der zweite wird zwar angezeigt allerdings
als eins.
Schauts euch einfach an, das Problem erklärt sich dann von selbst:
Die HTML ausgabe sieht so aus:
* menu
o main
eiiiiiiiiinsssss
+ link-1111/1111
NAME1111-1111
+ link-1111/2222
NAME1111-1111
Der Fehler>>
o main
eiiiiiiiiinsssss
+ link-1111/1111
NAME1111-1111
+ link-1111/2222
NAME1111-1111
Die XML:
<?xml version="1.0" encoding="utf-8"?>
<mebuca>
<menu>
<main name="eiiiiiiiiinsssss">
<link name="NAME1111-1111">link-1111/1111</link>
<link name="NAME1111-2222">link-1111/2222</link>
</main>
<main name="zwwwwweeeiiii">
<link name="NAME2222-1111">link-2222/1111</link>
<link name="NAME2222-2222">link-2222/2222</link>
</main>
</menu>
</mebuca>
PHP:
<?php
/* >>>>>> XML LADEN */
$xml_menu = simplexml_load_file('../xml/sys_menu.xml');
/* <<<<<< XML LADEN */
/* >>>>>> XML ANZEIGEN 1 */
echo "<ul>";
foreach ($xml_menu->children() as $a => $aa){
echo "<li>".$a."</li>\n";
echo "<ul>";
foreach ($xml_menu->$a->children() as $b => $bb){
echo "<li>".$b."</li>".$xml_menu->$a->$b->attributes()."\n";
echo "<ul>";
foreach ($xml_menu->$a->$b->children() as $c => $cc){
echo "<li>".$cc."</li>".$xml_menu->$a->$b->$c->attributes()."\n";
}
echo "</ul>";
}
echo "</ul>";
}
echo "</ul>";
/* <<<<<< XML ANZEIGEN 1 */
?>
Hoffe ihr könnt mir helfen, verzweifel langsam!
Vielen dank für eure müh und zeit und vielen dank für eure bisheriege mühe & zeit =)
Hi!
Die HTML ausgabe sieht so aus:
* menu
o main
eiiiiiiiiinsssss
+ link-1111/1111
NAME1111-1111
+ link-1111/2222
NAME1111-1111
Der Fehler>>
o main
eiiiiiiiiinsssss
+ link-1111/1111
NAME1111-1111
+ link-1111/2222
NAME1111-1111
Da kann ich nicht erkennen, was du als Fehler siehst. Aber ich denke mal, dass du das wie folgt haben möchtest. Du hast aber zuerst noch ein Problem mit dem HTML, das entstehen soll. Ein ul-Element darf als Kinder nur li haben. Wenn es also eine Unter-Liste geben soll, so muss diese innerhalb des li zu stehen kommen und nicht als Geschwister folgen, denn sonst wäre es ein Kind vom ul, was nicht sein darf.
<ul>
<li>text <!-- offen lassen -->
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
</li> <!-- jetzt erst schließen -->
</ul>
In deinem Code machst du das alles viel zu kompliziert. Variablen solltest du sprechend benennen, nicht einfach a, aa, b und so weiter. Es macht zwar mehr Mühe, sich aussagekräftige Bezeichner auszudenken, aber das zwingt dich auch, dir mehr Gedanken zu machen, was du mit der Variable bezweckst. Der Lohn der Mühe ist ein leichter lesbarer Code.
Auf deinen Code gehe ich mal nicht weiter ein. Stattdessen:
echo "<ul>\n";
// menu gibt es nur einmal, main mehrmals darin.
// Über menu "springen wir einfach drüber": ->menu->
// SimpleXML stellt für mehrfach vorkommende Elemente einen Iterator bereit,
// so dass man über alle main mit foreach iterieren kann.
foreach ($xml_menu->menu->main as $main) {
// $main enthält nun jeweils einen main-Zweig
// ("main" ist auch nicht gerade besonders sprechend,
// aber da du das so genannt hast, behalte ich den Namen bei.)
// Attribut-Zugriff erfolgt so, als ob das Element ein Array wäre: $main['name']
printf("\t<li>%s\n", htmlspecialchars($main['name']));
echo "\t\t<ul>\n";
// auf die Kinder greifen wir nicht wieder von der Wurzel aus zu,
// sondern einfach vom aktuellen Schleifenwert ausgehend: $main->link
// ->link hat wieder einen Iterator über alle Elemente gleichen Namens
foreach ($main->link as $link) {
printf("\t\t\t<li>%s - %s</li>\n", $link['name'], $link);
}
echo "\t\t</ul>\n";
echo "\t</li>\n";
}
echo "</ul>";
Vielleicht noch zur Erläuterung. Wenn ich vom Iterator spreche, so muss dazu gesagt werden, dass hier etwas "Magie" im Spiel ist. SimpleXML macht ausgiebig Gebrauch von "Magie", so dass man recht einfach auf die Dinge zugreifen kann. Ein Standard-Objekt bietet solche Funktionlität nicht von Haus aus an, ber man kann mit Hilfe der SPL solche Funktionalität nachrüsten. Die wichtigsten Funktionalitäten sind wohl der Iterator, der es ermöglicht, foreach auf ein Objekt anwenden zu können, so als ob es ein Array wäre. Dann gibt es noch ArrayAccess, das auf ein Objekt einen Zugriff wie oben bei den Attributen gesehen ermöglicht. Die restlichen Dinge der SPL sind mehr oder weniger für Spezialfälle gedacht.
Lo!
Hi!
XML einlesen und in die Attribute(<name></name>) Werte in einem input feld ausgeben.
Elemente also, nicht Attribute. Elemente sind stets Kinder eines anderen Elements (das Root-Element ausgenommen).
<<b>wert1</b>><input type="text" name="wert1" size="20" value="<?php echo $xml->modul->wert1[0]; ?>" /><<b>/wert1</b>>
Diese Zeile enthält gleich mehrere Fehler. Ein <, das kein Tag-Einleiter ist, ist als < zu notieren. Für > ist das nicht zwingend notwendig, aber auch nicht verkehrt.
Du fügst in das value-Attribut einen Wert aus anderer Quelle ein. Du musst dafür Sorge tragen, dass darin enthaltene HTML-Sonderzeichen nicht direkt notiert werden. Ein " beispielsweise, das nciht als " notiert ist, beendet das Attribut. Der Rest wird dann als HTML-Code versucht zu interpretieren. Gelingt es auf diese Weise jemandem erfolgreich von dir nicht vorgesehenen Code einzufügen, spricht man von XSS.
Lo!