Problem mit PHP DOM und WordML

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

  • Problem mit PHP DOM und WordML

    Hallo Leute,

    ich habe ein sehr seltsames Problem mit PHP DOM. Beim Versuch dieses zu lösen, habe ich das Programm immer mehr verkleinert, was zu dem Resultat führte, das PHP irgendwelche XML Dokumente verändert, ohne das man damit etwas macht.

    Genau gesagt habe ich ein Word-Dokument, was Bilder enthält, im XML-Format (WordML) gespeichert. Die Bilder werden Base64-Codiert mit in den Quelltext geschrieben.
    z.B.

    Code:
    (...)
    <w:binData w:name="wordml://03000001.png">iVBORw0KGgoAAAANSUhEUgAAAXwAAAD+CAYAAAA56L6tAAAgAElEQVR4nOy9fWwUZ57v+9mjjvSU
    5EjVkpG6JCO5ruCK8sIR3QtXcU84inuH1dAMq8U+jIQNOQJDVkmTjDJ2MkpsJpoBZ7QBT3QCJtoB
    OzohNlKIzWqZNKNlph0tTHd04LrRBbmQQFutG+tU6ca6XVKs24+EJd8/yq8x7zTYjp+P1ALXy1NP
    (...)
    </w:binData>
    (...)
    Wenn ich jetzt folgenden PHP-Code ausführe:

    PHP-Code:
    $source = new DOMDocument('1.0''utf-8'); // Hier alles probiert. Auch ISO etc.
    $source->load('datei.xml');
    $source->save('ergebniss.xml'); 
    und die ergebniss.xml wieder in Word öffne, werden die Bilder nicht mehr angezeigt. Es entstehen statt dessen so eine Art Platzhalter mit einem roten X, so wie im Internet Explorer, wenn ein Bild nicht gefunden wurde.
    Im Prinzip wird die Datei ja nur geöffnet und unverändert wieder gespeichert.

    Jetzt kommt aber das noch seltsamere. Wenn ich nun in Ultraedit die XML-Datei einmal von UTF nach ASCII konvertiere, dann wieder von ASCII nach UTF und die Datei speicher, werden die Bilder wieder angezeigt. Nur alle anderen Sonderzeichen, Aufzählungspunkte und so, sind natürlich nicht mehr erkennbar.

    Weiß jemand, woran das liegt und wie man das Problem löst?

    Vielen, vielen Dank im Voraus
    Schöne Grüße
    Axel

  • #2
    Hallo,

    DOM in PHP4 oder PHP5? Ich frage, weil ich DOM in PHP4 ned kenne...

    Wenn PHP5, dann evtl. mal so probieren:

    PHP-Code:
    $source = new DOMDocument('1.0''utf-8'); // Hier alles probiert. Auch ISO etc.
    $source->preserveWhiteSpace=false;
    $source->load('datei.xml');
    $source->save('ergebniss.xml'); 
    Vielleicht hilfts
    Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
    Schön - etwas Geschichte kann ja nicht schaden.
    Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

    Kommentar


    • #3
      Hi,

      vielen Dank für die Antwort. Hat aber leider nichts gebracht... gleiches Problem wie vorher.
      Hatte ich vergessen zu schreiben, sorry. Ich nutzt PHP 5 dafür.

      Vielleicht weitere Ideen?

      Vielen Dank nochmal,
      schöne Grüße
      Axel

      Kommentar


      • #4
        nicht wirklich - hast vielleicht schonmal den Quellcode der Dateien verglichen? am besten mal mit ner ganz kleinen Datei machen - evtl. kannst anhand von Unterschieden erkennen was da vielleicht falsch läuft?
        Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
        Schön - etwas Geschichte kann ja nicht schaden.
        Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

        Kommentar


        • #5
          AHA,

          vielen Dank erstmal. Das war schon ein ganz guter Hinweis (Hätte ich auch selbst drauf kommen können, aber ich glaub, ich sitz schon zuu lange dran).

          Ich hab eine Mini-Word-Datei gemacht mir nur einem Bild. Dann ist mir aufgefallen, dass sich die Dateigrößen von Original und per PHP gespeicherter Datei in wenigen (2-3) KB unterscheiden.

          Jetzt habe ich von Ultraedit mal die Funktion "Unix/Mac -> DOS" probiert, welches die Zeilenenden in das für Windows korrekte CR/LF verwandelt. Dann gehts mit Word.

          Nur wie kann ich jetzt bei PHP DOM festlegen, dass er die DOS-Kompatiblen Zeilenenden verwenden soll!?!

          Vielen Dank bis hier. Vielleicht weißt Du das ja zufällig (oder wer anders?)

          Schöne Grüße
          Axel

          Kommentar


          • #6
            Hallo nochmal,

            ich habe das Ganze nun ersteinmal mit einem Workaround erledigt, der sicherlich etwas bescheuert ist und auch etwas auf die Performance geht, aber die ist in diesem Fall nicht so wichtig. Ich lese nun nach dem Speichern der XML-Datei diese nochmal komplett ein, verändere mit einem RegEx die Zeilenenden und lege sie wieder ab :-)

            PHP-Code:
            $source = new DOMDocument('1.0''utf-8');
            $source->load('datei.xml');
            $source->save('ergebniss.xml');
                    
            $content    file_get_contents('ergebniss.xml');
            $content     preg_replace('/\r\n|\n\r|\n|\r/'"\r\n"$content);
            $out        fopen ('ergebniss.xml'"w");
            fputs($out$content);
            fclose($out); 
            Sinvollere Ideen nehme ich gerne entgegen :-)
            Auf jeden Fall nochmals vielen Dank für die Hilfe

            Schöne Grüße
            Axel

            Kommentar


            • #7
              An sowas hätte ich zur Not auch gedacht.

              Eine kleine 'Verbesserung':

              PHP-Code:
              $source = new DOMDocument('1.0''utf-8');
              $source->load('datei.xml');

              $content    $source->savexml();
              $content     preg_replace('/\r\n|\n\r|\n|\r/'"\r\n"$content);
              $out        fopen ('ergebniss.xml'"w");
              fputs($out$content);
              fclose($out); 
              Den zwischenschritt mit Speichern als Datei und dann wieder laden fand ich etwas 'umständlich'
              Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
              Schön - etwas Geschichte kann ja nicht schaden.
              Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

              Kommentar


              • #8
                Hi,

                na klar. So kriegt man den Inhalt ja gleich in eine Variable. Tja, manchmal sieht man den Wald vor lauter Bäumen nicht mehr

                So würd ich's auch schon fast nicht mehr als "Workaround" bezeichnen. Vielen, vielen Dank für Deine Hilfe.

                Jetzt läufts so, wie es laufen soll.

                Schöne Grüße
                Axel

                Kommentar

                Lädt...
                X