Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] XML Objekt durchsuchen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] XML Objekt durchsuchen

    Hallo,
    ich habe eine XML Datei welche ich in ein simpleXML objekt lade.
    Das Dokument ist eine Baumstruktur ähnlich einer HTML Seite
    Jedes Element in der Datei hat ein attribut ID.

    Nun suche ich eine Möglichkeit nach dieser ID zu suchen um das element zu bearbeiten.

    Muss ich das Dokument manuel rekursiv durchsuchen und mir dann von jedem Element die Attribute anschauen oder gibt es dafür eine Funktion?

    Bei meinen suhen in google bin ich immer auf xpath gestoßen, aber dort war es immer anders herum, dass der Pfad zu dem Element gegeben war.

    Hat jemand eine Idee?
    Danke


  • #2
    Nun suche ich eine Möglichkeit nach dieser ID zu suchen
    Bitte spezifizieren.

    XPath wäre an sich ausreichend (da es auch Platzhalter kennt). Ansonsten DOMXml und getElementById , kommt aber aufs selbe raus.
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Mein XML sieht z.B. so aus (blos eben viele Ebenen)

      PHP-Code:
      <root>
        <
      gruppe id="12348">
          <
      element id="12345" type="a">
            <
      element id="12346" type="b">
            </
      element
          
      </element>
          <
      element id="12347" type="b">
          </
      element>
      </
      gruppe>
      </
      root
      daraus suche ich dan nun z.B. genau das element mit der id=12346

      Ich habe nun eine Lösung gefunden und wo, im php manual
      Falls jemand das gleiche Problem mal hat...

      xpath war schon der richtige Ansatz

      mache es nun mit
      PHP-Code:
      $xmlNode->xpath('//element[@id="'.$id.'"]')); 
      Ich bekomme ein Array zurück mit dem inhalt vom Type "SimpleXMLElement Object" und genau mein Element

      Kommentar


      • #4
        Genau. Wie gesagt // ist hier ein Platzhalter der Art /*/.
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Zitat von nikosch Beitrag anzeigen
          Ansonsten DOMXml und getElementById , kommt aber aufs selbe raus.
          Ich hatte es zuerst mit DOMDocument::getElementById aber
          Manual:
          For this function to work, you will need either to set some ID attributes with DOMElement::setIdAttribute or a DTD which defines an attribute to be of type ID. In the later case, you will need to validate your document with DOMDocument::validate or DOMDocument->validateOnParse before using this function.
          Und da musste ich dann wieder passen da ich leider noch keine Ahnung habe wie ich eine DTD erstelle. Werd's aber bestimmt noch mal lernen

          Danke

          Kommentar


          • #6
            leider hängt es da nun schon wieder...
            ich hasse es der Anfänger zu sein

            Nun habe ich aus meine gesamten XML ($xml) das Element mittels xpath gefunden und als neues Objekt ($node) bekommen und habe meine Änderungen an den Attributen etc. gemacht.
            Wie bitte kann ich denn nun mein geändertes Objekt in den stamm zurück schreiben?
            Ich meine an die gleiche Stelle wo es vorher stand und damit natürlich das alte überschreiben.

            Leider bekomme ich ja mit xpath eine Kopie und nicht eine referenz auf das Objekt. Oder mache ich da noch etwas falsch?

            Kommentar


            • #7
              Returns an array of SimpleXMLElement objects or FALSE in case of an error.
              Ich sehe da kein Problem. AM Ende des Scripts kannst Du mit asXML() zurückschreiben oder ausgeben.
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Ja, aber das Objekt ist doch nur eine Kopie eines Astes und hat keinen Bezug mehr zum Stamm wo es her kommt.
                Anderungen an diesem oder das ausgeben des Astes funktioniert prima, nur leider sind die Änderungen dann nicht in meinem Stamm.
                Ich bräuchte nach der Änderung am Ast diese dann auch im Stamm damit ich mein gesamtes XLM wieder speichern kann.

                Kommentar


                • #9
                  Eigentlich sind Objekte immer Referenzen. Arbeitest DU unter PHP4?
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar


                  • #10
                    nein, PHP 5.3

                    Ich bekomme von xpath ein array mit einem Objekt zurück.
                    Änderungen an diesem Objekt haben keine Auswirkung auf das Stammobjekt aus dem xpath den zweig geholt hat.

                    leider...

                    Kommentar


                    • #11
                      ?
                      PHP-Code:
                      <?php

                      $test 
                      '<?xml version="1.0"?>
                        <test>
                          <myitem id="id01" />
                        </test>'
                      ;

                      $sxe = new SimpleXMLElement ($test);

                      $nodes $sxe->xpath ('//*[@id="id01"]');

                      $nodes[0]->addAttribute ('new' 'yes');

                      echo 
                      $sxe->asXML();
                      Code:
                      <?xml version="1.0"?>
                      <test>
                          <myitem id="id01" new="yes"/>
                        </test>
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar


                      • #12
                        Vielen Dank, Du hast meinen Tag gerettet
                        so gehts,

                        Ich hatte mir eine getElementById funktion gemacht
                        und da ist mir wohl dann irgendwo die referenz verloren gegangen.
                        Ohne extra Funktion geht's.

                        Dann werd ich mich nochmal auf die Suche machen...
                        Nochmal vielen Dank

                        Kommentar


                        • #13
                          Was ich allerdings nicht hinbekommen habe, ist, dem Objekt nen neuen (inner) Value zuzuweisen. Ich würde Dir echt DOM nahelegen, wenn Du effektiv mit XML arbeiten willst.
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            Zitat von nikosch Beitrag anzeigen
                            Was ich allerdings nicht hinbekommen habe, ist, dem Objekt nen neuen (inner) Value zuzuweisen.
                            Da kann ich leider auch nicht helfen.
                            Habe Deinen rat befolgt und verwende nun dom. Wirklich einiges mehr an Funktionen und geht wunderbar, Danke

                            Kommentar

                            Lädt...
                            X