Ankündigung

Einklappen
Keine Ankündigung bisher.

XML - removeChild

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • XML - removeChild

    Hallo,

    ich bin neu hier und hoffe das mit jemand helfen kann.


    ich habe eine xml Datei welche folgendermaßen aufgebaut ist

    Code:
    <element1 typ="eins">Text</element1>
    <element2 typ="zwei">Zahl</element2>
    <element3 typ="drei">
      text
      <nummer>1</nummer>
      text
      <nummer>2</nummer>
      text
      <nummer>3</nummer>
      text
    </element3>
    Ich möchte nun bei allen Elementen, die einen typ haben, die Kinder löschen.


    habe mir dazu Folgendes überlegt:


    Code:
      $DOM->Load("quelle.xml");
      $XPATH = new DOMXPath($DOM);
    
      // sollte alle Elemente mit einem typ-Attribut loeschen
      $Elements = $XPATH->query("//[@typ]");
    
      // alle gefundenen Elemente durchlaufen
      foreach ($Elements as &$Element)
      {
        // wenn es Kinder gibt -> löschen
        foreach ($Element->childNodes as &$Child)
        {
          $Element->removeChild($Child);
        };
      };
    
      $DOM->save("ergebnis.xml");

    Tja das Ergebnis ist leider nicht genau das was ich haben möchte

    Code:
    <element1 typ="eins"/>
    <element2 typ="zwei"/>
    <element3 typ="drei">
      text
      <nummer>1</nummer>
      text
      <nummer>2</nummer>
      text
      <nummer>3</nummer>
      text
    </element3>
    Wieso hat "element3" nachher noch Kinder? Müssten die nicht auch weg sein?

    Ich benutze PHP5 so kann ich in der foreach-Schleife die Referenzen verwenden.

    Danke im Voraus für eure Hilfe

  • #2
    Wenn noch nie jemand dieses Problem hatte muss es ja eine einfache Lösung geben ansonsten wurde doch sicherlich auch schon eine Lösung gefunden.

    Kommentar


    • #3
      Elements = $XPATH->query("//[@typ]");
      Damit bekomme ich ein invalid expression. Mit * for "alle Elemente" geht's:
      Code:
      Elements = $XPATH->query("//*[@typ]");
      Und das Löschen dann so
      Code:
      // alle gefundenen Elemente durchlaufen
      foreach ($Elements as $Element)
      {
      	// solange es Kinder gibt -> das erste löschen
      	while($Element->hasChildNodes() ) {
      		$Element->removeChild($Element->firstChild);
      	}
      }

      Kommentar


      • #4
        mit welcher Klasse machst du das ?!

        http://phpxmlclasses.sourceforge.net/

        hie rfindest du ein aar XML klassen .. inkl Doku ..

        Kommentar


        • #5
          Zitat von M3g4Star
          mit welcher Klasse machst du das ?!
          Zitat von a-team
          Ich benutze PHP5
          Und die Objekte und Methoden passen zu http://de.php.net/dom

          Kommentar


          • #6
            Zitat von Bruchpilot
            Zitat von M3g4Star
            mit welcher Klasse machst du das ?!
            Zitat von a-team
            Ich benutze PHP5
            Und die Objekte und Methoden passen zu http://de.php.net/dom
            *hupsi*

            Kommentar


            • #7
              danke für die Antworten

              das * habe ich beim Abschreiben vergessen ist in meinem Code natürlich drin.

              Werde den Vorschlag später mal testen, wenn ich an meinen Code kann.

              Aber theoretisch müsste mein Code doch auch tun oder?


              Ja ich benutze PHP5 und Dom

              Kommentar


              • #8
                wenn Du Dir ein echo '.'; in die innere foreach Schleife setzt, siehst DU, dass sie nur einmal durchlaufen wird.
                Kann ich mir so vorstellen: das DOM Objekt merkt sich currentNode und bei jedem Durchlauf von foreach wird currentNode->nextSibling aufgerufen.
                Wenn currentNode aber aus dem DOM Objekt entfernt wird, hat es kein nextSibling mehr.

                Zitat von a-team
                das * habe ich beim Abschreiben vergessen ist in meinem Code natürlich drin.
                Bitte Code nicht extra (und ungetestet) für das Forum neuschreiben. Die Fehlerquote ist so hoch ...und zeitraubend.

                Kommentar


                • #9
                  mach ich normal auch nicht, habe meinen Code im Moment nur leider nicht zur Hand

                  Kommentar

                  Lädt...
                  X