Ankündigung

Einklappen
Keine Ankündigung bisher.

XSLTProcessor::transformToXml geht schief wegen LibXMLError bzgl. Entities

Einklappen

Neue Werbung 2019

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

  • XSLTProcessor::transformToXml geht schief wegen LibXMLError bzgl. Entities

    Hallo zusammen,

    ich habe Probleme beim Umwandeln eines XML Strings per Schema (.xslt Datei) in einen neuen XM String.
    Der XML String wird per XMLWriter mit Daten aus einer Datenbank erstellt. Der XML String wird dann per XSLTProcessor::transformToXml transformiert. Hierbei kommt es zu einem LibXMLError ("Entity 'deg' not defined").

    Hier mal der Code:
    PHP-Code:
    $output $xmlWriter->outputMemory(true);


    $xmlDoc = new DOMDocument();
    $xmlDoc->loadXML($output);

    $xslDoc = new DOMDocument();
    $xslDoc->load('schema.xslt');

    $proc = new XSLTProcessor();
    $proc->importStylesheet($xslDoc);
    $output $proc->transformToXML($xmlDoc);

    if (
    $output === false || strlen($output) === 0) {

        
    Debugger::logError(libxml_get_last_error());
        return 
    false;

    Das Problem sind wohl verschiedene HTML Entities in der Datenbank. Als Beispiel sei mal genannt, das Entity
    Code:
    °
    für Grad.

    Den output des XMLWriters mit
    PHP-Code:
    $output html_entity_decode($output); 
    zu behandeln hilft auch nicht, da hier auch immer im Text enthaltene
    Code:
    &
    zurück in
    Code:
    &
    umgewandelt werden.

    Was kann man hier tun?

    Eine Beispieltext (HTML-)Text aus der Datenbank sieht so aus, sowas wird dann in die XML Datei geschrieben. Man sieht, dass das Grad Zeichen unterschiedlich in die Datenbank kommen kann, entweder als ° oder schon als Entity. Das macht das ganze schwierig beim Export:
    Code:
    <p>Temperatur bei 36° C.</p>
    
    <p>Temperatur bei 34&deg; C.</p>
    
    <p>GmbH &amp; Co KG</p>
    
    <p>3 &lt; 5</p>
    Mein jetziger Behelf sieht so aus, dass ich vor der Transformation alle bisher aufgetretenen Fälle per str_replace() entferne, aber das kann ja nicht die Lösung sein:
    PHP-Code:
    $output str_replace('&deg;''°'$output);
    $output str_replace('&ndash;''-'$output);
    $output str_replace(array('&rdquo;''&ldquo;''&bdquo;'), '"'$output);
    $output str_replace(array('&rsquo;''&lsquo;''&sbquo;'), "'"$output); 
    Vielen Dank im Voraus!
    There are 10 kind of people: those who understand binary and those who don't.

  • #2
    Sieht für mich so aus, als würdest du einfach nur den Kontextwechseln nicht behandeln und jetzt versuchst du an den Symptomen herumzuschrauben, was aber der falsche Weg ist. Ein str_replace() sollte beim Lesen oder Erstellen von XML nirgendwo erforderlich sein, ansonsten ist das ein klares Zeichen, dass man etwas falsch macht. Nachdem du nicht zeigst, was du machst, kann man dazu auch nicht viel sagen.

    Du solltest ein vollständiges kleines Beispiel posten, bei dem das Problem nachvollziehbar auftritt. Code-Ausschnitte sind in der Regel nicht wirklich hilfreich, um einen Fehler zu finden.

    Kommentar


    • #3
      DOMDocument-Instanzen erkennen Entities nur dann, wenn diese über eine passende DTD mit eingelesen (definiert) werden.

      Kommentar


      • #4
        Zitat von Talwin
        Man sieht, dass das Grad Zeichen unterschiedlich in die Datenbank kommen kann, entweder als ° oder schon als Entity.
        Ich würde (auch) sagen das XML Entities in der DB schlichtweg falsch sind.
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar

        Lädt...
        X