Anzeige:
Ergebnis 1 bis 10 von 10

Thema: SimpleXML xpath

  1. #1
    Registrierter Benutzer
    Registriert seit
    11.06.2003
    Beiträge
    37

    Question SimpleXML xpath

    hi zusammen,
    ich habe nen kleines Prob mit der xpath() Funktion von SimpleXML.
    HTML-Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <container>
      <texte>
        <text user="user1">llllasdfasdfeorpqi</text>
        <text user="user2">oouzzrrzreorpqi</text>
      </texte>
    </container>
    So jetzt wuerde ich gerne über xpath den text von user1 ändern :
    PHP-Code:
    <?php
    $xml 
    simplexml_load_file('dateimitobigemxml.xml');
    // Jedes ergebnis von der Xpath anfrage wird in dem Array $result als 
    // Referenz  gespeichert. Also $result[0] ist eine Referenz auf $xml->texte->text[0];
    $result $xml->xpath('/texte/text [@user="user1"]');
    // $result[0] will ich verändern:
    $result[0]['user'] = 'ehemalsUser1'// Attribute aendern geht
    $result[0] = 'neuertext'// Inahlt ändern funktioniert nicht
    echo $xml->asXML(); // Siehe ersten unteren XML-Code
    // Das ganze ohne xpath():
    $xml->texte->text[0] = 'zweiterneuerText'// Funktioniert auch
    echo $xml->asXML(); // Siehe zweiten unteren XML-Code
    ?>
    Erste Ausgabe:
    HTML-Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <container>
     <texte>
      <text user="ehemalsUser1">llllasdfasdfeorpqi</text>
      <text user="user2">oouzzrrzreorpqi</text>
      </texte> 
    </container>
    Zweite XML Ausgabe:
    HTML-Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <container>
     <texte>
      <text user="ehemalsUser1">zweiterneuerText</text>
      <text user="user2">oouzzrrzreorpqi</text>
      </texte> 
    </container>
    Wie es scheint, wird $result[0] zu einem string umgewandelt und nicht wie ein richtiges SimpleXMLObject behandelt.
    Oder mach ich irgendetwas falsch?

    Gruss
    senfmensch
    Geändert von senfmensch (13-06-2006 um 13:53 Uhr)

  2. #2
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von senfmensch
    Oder mach ich irgendetwas falsch?

    Gruss
    senfmensch
    Jau,
    da wird ja auch ganz wild gecodet.

    Für doch mal var_dump(); aus um Geheimnisse zu enträtseln.

    PHP-Code:
    $result $xml->xpath('/texte/text [@user="user1"]'); 
    var_dump($result);
    // $result[0] will ich verändern: 
    $result[0]['user'] = 'ehemalsUser1'// Attribute aendern geht 
    $result[0] = 'neuertext'// Inahlt ändern funktioniert nicht 
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  3. #3
    Registrierter Benutzer
    Registriert seit
    11.06.2003
    Beiträge
    37
    joar hab ich natuerlich schon gemacht
    HTML-Code:
    array(1) {
      [0]=>
      object(SimpleXMLElement)#2 (2) {
        ["@attributes"]=>
        array(1) {
          ["user"]=>
          string(5) "user1"
        }
        [0]=>
        string(18) "llllasdfasdfeorpqi"
      }
    }
    $result[0][0] zu setzen bringt aber auch nix dann kommt bei asXML(); das raus:
    HTML-Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <container>
     <texte>
      <text user="ehemalsUser1">llllasdfasdfeorpqi</text>
      <text user="user2">oouzzrrzreorpqi</text>
      <text>neuertext</text></texte> 
    </container>
    und das ist fast noch schlimmer

    Gruss
    senfmensch

  4. #4
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von senfmensch
    joar hab ich natuerlich schon gemacht
    Gruss
    senfmensch
    Ich kenne die Klasse nicht.
    Was sagt den die Doku?
    Gibt es dort vielleicht eine Methode WriteAttribut(), SetAttribut() o. AddAttribut?
    Zur Not schreibst Du so eine Methode, dann sollte es auf jeden Fall
    funktionieren.

    Ich würde auch mit $xml-> weitermachen, da dies dein eigentliches
    Objekt ist.
    Du hast einen externen Array gebildet in dem zusätzlich dein Objekt
    gespeichert wurde. Nett aber unnütz.

    Du kannst den Wert von außen nur überschreiben, wenn du den
    Namen der Variable kennst.
    Besser ist es aber dafür einer Methode zu verwenden, welche innerhalb
    der Klasse den Wert neu setzt. Von außen wird der Methode dann
    der String übergeben, wie Du es auch schon bei $xml->xpath(); gemacht hast.

    Schau dir mal in der Klasse an, wie @user="user1" gespeichert wurde.
    Dann kannst Du mit einer zusätzlichen Methode + $this>variable den
    Wert überschreiben.
    Geändert von Romanday (13-06-2006 um 12:03 Uhr)
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  5. #5
    Registrierter Benutzer
    Registriert seit
    11.06.2003
    Beiträge
    37
    Zitat Zitat von Romanday
    Ich kenne die Klasse nicht.
    Was sagt den die Doku?
    Gibt es dort vielleicht eine Methode WriteAttribut(), SetAttribut() o. AddAttribut?
    Zur Not schreibst Du so eine Methode, dann sollte es auf jeden Fall
    funktionieren.
    habe leider keine Ahnung von C/C++ drum wirds nicht viel bringen wenn ich die Klasse anschaue
    Die Funktionen addChild(), addAttribute() gibts, doch existieren meine nodes und attribute ja schon.
    Zitat Zitat von Romanday
    Ich würde auch mit $xml-> weitermachen, da dies dein eigentliches
    Objekt ist.
    Du hast einen externen Array gebildet in dem zusätzlich dein Objekt
    gespeichert wurde. Nett aber unnütz.
    das return von xpath ist ein Array mit referenzen auf die Nodes des SimpleXML Objects und ist nix nichts zusaeztliches
    Zitat Zitat von Romanday
    Du kannst den Wert von außen nur überschreiben, wenn du den
    Namen der Variable kennst.
    Besser ist es aber dafür einer Methode zu verwenden, welche innerhalb
    der Klasse den Wert neu setzt. Von außen wird der Methode dann
    der String übergeben, wie Du es auch schon bei $xml->xpath(); gemacht hast.
    xpath() ist nicht von mir geschrieben das ist "builtin".
    $result[0] ist eine referenz auf $xml->texte->text[0], also kenne ich ja die Variable, nur verhaelt sich das irgendwie anders anders beim speichern
    Zitat Zitat von Romanday
    Schau dir mal in der Klasse an, wie @user="user1" gespeichert wurde.
    Dann kannst Du mit einer zusätzlichen Methode + $this>variable den
    Wert überschreiben.
    wie gesagt die ResultElemente sind Referenzen auf die Nodes von dem SimpleXML object.
    $result[0]['user'] = 'neuerUser';
    ist das gleiche wie
    $xml->texte->text[0]['user'] = 'neuerUser';

    die xpath methode macht mir sozusagen:
    $result[0] = &$xml->texte->text[0];

    drum ist es komisch dass ich nicht einfach
    $result[0] = 'neuerString';
    machen kann, denn bei $xml->texte->text[0] funktionierts

    Gruss
    senfmensch

  6. #6
    Registrierter Benutzer
    Registriert seit
    11.06.2003
    Beiträge
    37
    gibt wohl irgendwie ein Problem, wenn ich eine Referenz benutze:
    PHP-Code:
    $resultXML = &$xml->texte->text[0];
    $resultXML['name'] = 'neuerName'//funktioniert
    $resultXML 'neuerText'// funktioniert nicht! GRML 
    ich glaub ich wende mich mal an die Mailingliste

  7. #7
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    XPath ist zum lesen und nicht zum Schreiben gedacht
    Ich würde wenn du Knoten Bearbeiten möchtest folgendes Machen.

    PHP-Code:
    $xml simplexml_load_file('dateimitobigemxml.xml''DomDocument' );
    $DomElement $xml->getElementsByName('meineKnoten')->item(0);
    .... 
    Ab hier Kannst du mit DOM Arbeiten und nach Herzenslust Manipulieren ... 
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  8. #8
    Registrierter Benutzer
    Registriert seit
    11.06.2003
    Beiträge
    37
    klar kann ichs mit dom machen
    aber das verhalten mit der referenz ist doch sehr merkwuerdig und würde mich interessieren wieso das nicht geht.
    ich fänds jedenfalls sehr sinnvoll und arbeitserleichternd wenn man die ergebnisse von xpath gleich bearbeiten kann

  9. #9
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Noch mal, DOMXPath ist dazu gemacht schnell und Unkomplizirt auf einzelne Elemente zu greifen zu können und nicht zum Bearbeiten. Also ich Arbeite täglich mit DOM und weis jetzt nicht wo du nicht klar kommst. Seit PHP5 hat man sich erheblich an den W3C Xpath angelehnt was einem die Arbeit erheblich erleichtert.
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  10. #10
    Registrierter Benutzer
    Registriert seit
    11.06.2003
    Beiträge
    37
    hab ich irgendwo geschrieben, dass ich was mit dom mache ?
    ich wunder mich eben nur ueber das verhalten dieser referenz bei nem simplexmlelement

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •