Ankündigung

Einklappen
Keine Ankündigung bisher.

Inhalt einer XML ändern

Einklappen

Neue Werbung 2019

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

  • Inhalt einer XML ändern

    Hallo,

    ich versuche den Inhalt einer xml mit "simplexml" zu ändern. Bin jetzt nach gefühlten 1000 Versuchen soweit das mir das script das erste Objekt ausgibt,
    aber an die Children Objekte komm ich irgendwie nicht ran. Kann es sein das es daran liegt das die Children irregulär geschlossen werden ?

    Es geht darum den FileCRC Wert zu ändern.

    XML:
    Code:
    <DlcIndex>
      <Package platform="all" unzip="false"ignore="false">
        <LocalDir name="dlc" />
        <FileSize val="12007" />
        <FileCRC val="2141869204" />
        <Version val="1" />
        <FileName val="test-download.zip" />
        <Language val="all" />
      </Package>
      <Package platform="all" unzip="false"ignore="false">
        <LocalDir name="dlc" />
        <FileSize val="8001" />
        <FileCRC val="3549625791" />
        <Version val="1" />
        <FileName val="test-download2.zip" />
        <Language val="all" />
      </Package>
    ....
    ....
    </DlcIndex>
    PHP:

    PHP-Code:
    <?php 

    $xmlFile 
    'test.xml'

    if (
    file_exists($xmlFile)) { 
        
    $xml simplexml_load_file($xmlFile); 

        foreach ( 
    $xml->Package as $user )   { 
              echo 
    'val: ' $user['platform'] . '<br>';   

          foreach (
    $xml->children() as $second_gen) {
        echo 
    ' Test1 ' $second_gen['role'];

        foreach (
    $second_gen->children() as $third_gen) {
            echo 
    ' Test2 ' $third_gen['role'] . ';';

          }
        }
      }   
             
    } else { 
        exit(
    "Datei $xmlFile kann nicht ge\366ffnet werden.");

    ?>
    Grüße damarist


  • #2
    Na toll kaum hab ich es gepostet hab ich glaub die Lösung gefunden.
    Aber gibt es vieleicht einen kürzeren oder besseren weg das zu schreiben ?

    Hier meine Lösung:

    PHP-Code:
    <?php  

    $xmlFile 
    'test.xml';  

    if (
    file_exists($xmlFile)) {  
        
    $xml simplexml_load_file($xmlFile);  

         foreach (
    $xml->children() as $second_gen) { 
         
                 foreach (
    $second_gen->FileSize as $third_gen) { 
               echo 
    ' Test222 ' $third_gen['val'] . ';'
       

            foreach (
    $second_gen->IndexFileCRC as $third_gen) { 
               echo 
    ' Test222 ' $third_gen['val'] . ';'
             
             
            } 
          } 
       }    
              


    else {  
        exit(
    "Datei $xmlFile kann nicht ge\366ffnet werden."); 
    }  
    ?>

    Kommentar


    • #3
      Nicht vereinfacht, aber gibt es einen Grund wieso du den Inhalt der XML gar nicht änderst obwohl du das laut Topic-Titel ja willst ?
      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

      Kommentar


      • #4
        Hihi, ja mein Problem war das ich nicht mal an den zu veränderten Wert rangekommen bin. Jetzt da ich ihn in eine Variable packen kann müsste es ja einfach sein ihn zu ändern und abzuspeichern. Da gibt es doch bestimmt auch eine simplexml Funktion ?

        Kommentar


        • #5
          Ok ich habe es nun geschafft den Wert zu ändern und abzupeichern. Allerdings schreibt simpleXML auch noch den Header "
          <?xml version="1.0"?>" mit in die Datei. Kann man den irgendwie weglassen ?

          Hier mein Code:

          PHP-Code:
          <?php  

          $xmlFile 
          'test.xml';  

          if (
          file_exists($xmlFile)) {  
              
          $xml simplexml_load_file($xmlFile);  

               foreach (
          $xml->children() as $second_gen) { 
               
                       foreach (
          $second_gen->FileSize as $third_gen) { 
                     echo 
          ' Test222 ' $third_gen['val'] . ';'
             

                  foreach (
          $second_gen->IndexFileCRC as $third_gen) { 
                
          $third_gen['val'] = "CHANGED";
                    echo 
          ' Test222 ' $third_gen['val'] . ';'
                   
                   
                  } 
                } 
             }    
                    




          else {  
              exit(
          "Datei $xmlFile kann nicht ge\366ffnet werden."); 
          }  

          echo 
          $xml->asXML('test.xml');

          ?>

          Greets

          Kommentar


          • #6
            LIBXML_NOXMLDECL funktioniert nicht grrr

            Kommentar


            • #7
              Ein Problem hab ich noch. Das Script gibt mir ja nun die Filesize werte von allen Packages wieder. Wie brauche aber nur den Wert des ersten Package.

              Kommentar


              • #8
                Ein bisschen musst du uns schon abholen, was hast du aktuell für eine Datenstruktur?
                Relax, you're doing fine.
                RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                Kommentar


                • #9
                  Zitat von VPh Beitrag anzeigen
                  Ein bisschen musst du uns schon abholen, was hast du aktuell für eine Datenstruktur?
                  Hi, steht alles im ersten Post oben. Also das Script gibt mir die Werte für alle Packages wieder ich brauche aber nur den Wert des ersten Packages. Gibt es eine Funktion die zum Beispiel sagt, gib mir den Wert des ersten Vorkommens eines Tags ?

                  Kommentar


                  • #10
                    Ja. Kannst du mit xPath machen.
                    Gutes Tool zum rumprobieren: http://chris.photobooks.com/xml/
                    Relax, you're doing fine.
                    RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                    Kommentar


                    • #11
                      Kann mir einer bitte mal ein Beispiel mit xpath machen ? Versuche es seit Tagen bekomme aber nichts brauchbares heraus ;-(

                      Kommentar


                      • #12
                        Code:
                        <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
                        <DlcIndex>
                          <Package platform="all" unzip="false" ignore="false">
                            <LocalDir name="dlc" />
                            <FileSize val="12007" />
                            <FileCRC val="2141869204" />
                            <Version val="1" />
                            <FileName val="test-download.zip" />
                            <Language val="all" />
                          </Package>
                          <Package platform="all" unzip="false" ignore="false">
                            <LocalDir name="dlc" />
                            <FileSize val="8001" />
                            <FileCRC val="3549625791" />
                            <Version val="1" />
                            <FileName val="test-download2.zip" />
                            <Language val="all" />
                          </Package>
                        </DlcIndex>
                        Code:
                        //DlcIndex/Package[1]
                        http://de.wikipedia.org/wiki/XPath Siehe Beispiel
                        Relax, you're doing fine.
                        RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                        Kommentar


                        • #13
                          Danke aber so hab ichs auch schon versucht, bekomme aber keine Ausgabe.

                          Hier mein Versuch:

                          PHP-Code:
                          $xmlFile 'test2.xml';  

                          if (
                          file_exists($xmlFile)) {  

                          $xml simplexml_load_string($xmlFile); 
                          $result $xml->xpath("//DlcIndex/Package[1]/FileCRC"); 

                          echo 
                          $result


                          Kommentar


                          • #14
                            PHP-Code:
                            $source '<DlcIndex>
                              <Package platform="all" unzip="false" ignore="false">
                                <LocalDir name="dlc" />
                                <FileSize val="12007" />
                                <FileCRC val="2141869204" />
                                <Version val="1" />
                                <FileName val="test-download.zip" />
                                <Language val="all" />
                              </Package>
                              <Package platform="all" unzip="false" ignore="false">
                                <LocalDir name="dlc" />
                                <FileSize val="8001" />
                                <FileCRC val="3549625791" />
                                <Version val="1" />
                                <FileName val="test-download2.zip" />
                                <Language val="all" />
                              </Package>
                            </DlcIndex>'
                            ;
                            $xml = new DOMDocument();

                            /*
                             *  DOMDocument mit deinem XML füllen, 
                             *  alternativ load() wenns eine Datei ist, wie in deinem Fall
                             */
                            $xml->loadXML($source);
                            $xPath = new DOMXPath($xml);
                            $nodeList $xPath->query('//DlcIndex/Package[1]/FileCRC'); // Ergebnis ist eine NodeList
                            foreach ($nodeList as $node){
                                echo 
                            $node->getAttribute(val); // Zugriff auf das Attribut - 2141869204
                            }
                            // bzw.
                            $nodeList $xPath->query('//DlcIndex/Package[1]/FileCRC/@val'); // Ergebnis ist eine NodeList, Nodes haben das Attribut "val" als Wert
                            foreach ($nodeList as $node){
                                echo 
                            $node->value// 2141869204

                            Kenne leider keinen anderen Weg mit der NodeList umzugehen.
                            Relax, you're doing fine.
                            RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                            Kommentar


                            • #15
                              Tatsächlich. Aber warum klappt das mit simpleXML nicht ?

                              Kommentar

                              Lädt...
                              X