pahe: simplexml_load_file

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']; ?>  
&nbsp;&nbsp;&nbsp;<<b>wert1</b>><input type="text" name="wert1" size="20" value="<?php echo $xml->modul->wert1[0]; ?>" /><<b>/wert1</b>>  
&nbsp;&nbsp;&nbsp;<br><br>  
<?php $xml->modul[0]->wert2[0] = $_POST['wert2']; ?>  
&nbsp;&nbsp;&nbsp;<<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>
  1. sry->
    Wie kann ich auf ein XML Attribute zugreifen >>DAS ICH NICHT KENNE<<????

  2. 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.

    So.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. 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.

      So.

      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.

      1. 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.

        So.

        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.

        1. 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>

          1. 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!

            1. 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

              1. 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!

                1. 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 */
                  
                  1. 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!

                    1. 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 =)

                      1. 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!

  3. 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 &lt; 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 &quot; 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!