uepselon: Umlaute wollen einfach nicht durch den Parser!

Hallo,

folgendes Problem:

Ich habe eine XML Datei die Umlaute enthält. Bzw. die Umlaute werden bevor Sie in die XML Datei geschrieben werden, in die entprechenden Entitiys geparst (mit htmlentities in PHP).

<object>
<title>Text mit Umlauten &auml; &ouml; &uuml;</title>
</object>

So wenn ich nun dieses XML File mittels XSL-File per PHP/Sablotron parsen will, fehlen die drei Umlaute :-( Es kommt auch kein Fehler!

Als Zeichensatz verwende ich ISO-8859-1, der müsste also passen. Und wenn ich statt &auml; z.B. den ISO Code &#196; verwende meckert der Parser das er dieses Entity nicht kennt :-(

Auch eine Definition von DOCTYPE innerhlab des XSL Files mit <!ENTITY auml "&#196"> brachte keinen Erfolg.

Steh ich grad auf dem Schlauch, oder warum will dass nicht klappen?

Gruß,

ueps

  1. Hallo nochmal,

    ich habe das Problem nochmals etwas eingrenzen können:

    Und zwar lese ich in diesem speziellen Fall das XML File mittels

    $p = xml_parser_create();
    xml_parse_into_struct($p, $simple, $vals, $index);
    xml_parser_free($p);

    in ein Array (vals und index)

    der Inhalt in vals ist hierbei der kritische Punkt.

    Bsp.

    <xmlfile>
    <tag1>Das hier geht &lt; &gt; und das auch &amp;</tag1>
    </xmlfile>

    <xmlfile>
      <tag1>Bis hier steht noch alles im Array vals &auml; Alles nach dem Umlaut ist weg :-(</tag1>
    </xmlfile>

    Weiß evtl. einer woran das liegt?

    Gruß,

    ueps

  2. Hallo,

    Ich habe eine XML Datei die Umlaute enthält. Bzw. die Umlaute werden bevor Sie in die XML Datei geschrieben werden, in die entprechenden Entitiys geparst (mit htmlentities in PHP).

    Tja. XML kennt aber keine HTML-Entities.

    Die einzigen Entities die XML von haus aus kennt, sind:
    <  &lt;

    &gt;

    &  &amp;
    "  &quot;
    '  &apos;

    Als Zeichensatz verwende ich ISO-8859-1, der müsste also passen.

    Wenn du eh schon ISO-8859-1, kannst du ä,ö,ü etc. schreiben. Das ist der Sinn dieser Angabe.

    Und wenn ich statt &auml; z.B. den ISO Code &#196; verwende meckert der Parser das er dieses Entity nicht kennt :-(

    Davon abgesehen, dass &#196; eigentlich &Auml; ist, könntest du mit der Unicode-Notation versuchen, also &#xE4; für ä.

    Grüße
    Thomas

    --
    Surftip: kennen Sie schon Pipolino's Clowntheater?
    http://www.clowntheater-pipolino.net/
    1. Hallo,

      Tja. XML kennt aber keine HTML-Entities.

      Ok, ich hab mal folgendermaßen Entities definiert:

      <!DOCTYPE object [
      <!ENTITY Test "This is a entity.">
      <!ENTITY auml "&amp;auml;">
      ]>

      Wenn ich nun &Test; oder &auml; verwendet müsste ja zumindest später nach dem Parsen "This is entity." und &amp;auml; dastehen oder?
      Das einzige was passiert ist, dass der Parser wenigstens nimmer meckert das es die Entites nicht kennt. Aber statt dem eigentlichen Inhalt ist an der Stelle des Entities nach dem Parsen nix mehr zu sehen, woran liegts?

      Wenn du eh schon ISO-8859-1, kannst du ä,ö,ü etc. schreiben. Das ist der Sinn dieser Angabe.

      Ok, den Zeichensatz habe ich testhalber verwendet, will eigentlich lieber alles un UTF-8 machen. Zudem macht PHP/Sablotron sogar dann mit ä Probleme wenn ich explizit auf ISO-8859-1 verweise. (PHP Version 4, xslt_process)

      Davon abgesehen, dass &#196; eigentlich &Auml; ist, könntest du mit der Unicode-Notation versuchen, also &#xE4; für ä.

      Da kommt dann was ganz wirres raus, ein nicht leserliches Zeichen!

      Gruß,

      ueps

      1. Hallo,

        Tja. XML kennt aber keine HTML-Entities.

        Ok, ich hab mal folgendermaßen Entities definiert:

        [...]

        Wenn ich nun &Test; oder &auml; verwendet müsste ja zumindest später nach dem Parsen "This is entity." und &amp;auml; dastehen oder?

        Das kommt darauf an, was für einen XML-Prozessor du verwendest. Kann dieser Entities auflösen?

        Ich nehme an du benützt Expat, dazu gibt es einen guten Artikel unter http://www.xml.com/pub/a/1999/09/expat/index.html

        Du solltest auch die encoding im xml_parser_create() mitangeben.
        http://at2.php.net/manual/en/function.xml-parser-create.php

        Das einzige was passiert ist, dass der Parser wenigstens nimmer meckert das es die Entites nicht kennt. Aber statt dem eigentlichen Inhalt ist an der Stelle des Entities nach dem Parsen nix mehr zu sehen, woran liegts?

        Normalerweise würde ich dazu sagen, dass es mit dem nicht erkannten Entity zusammenhängt und damit es dies nicht aufgelöst wird. Aber ich weiss nicht was wirklich in deinem XML steht.

        Wenn du eh schon ISO-8859-1, kannst du ä,ö,ü etc. schreiben. Das ist der Sinn dieser Angabe.

        Ok, den Zeichensatz habe ich testhalber verwendet, will eigentlich lieber alles un UTF-8 machen.

        http://at2.php.net/manual/en/function.utf8-encode.php

        Zudem macht PHP/Sablotron sogar dann mit ä Probleme wenn ich explizit auf ISO-8859-1 verweise. (PHP Version 4, xslt_process)

        Welche PHP 4 version?
        (das liebe ich an PHP, (sogar) die (unter) Versionen sind zueinander schon M$-verdächtig inkomatibel. http://at2.php.net/manual/en/function.xslt-process.php)

        Grüße
        Thomas

        --
        Surftip: kennen Sie schon Pipolino's Clowntheater?
        http://www.clowntheater-pipolino.net/
        1. Hallo,

          Das kommt darauf an, was für einen XML-Prozessor du verwendest. Kann dieser Entities auflösen?

          Gute Frage, verwendet wird meines Wissens Sablotron!

          Du solltest auch die encoding im xml_parser_create() mitangeben.
          http://at2.php.net/manual/en/function.xml-parser-create.php

          Ja das mich schon, hab jetzt alles auf UTF-8 umgestellt.

          Normalerweise würde ich dazu sagen, dass es mit dem nicht erkannten Entity zusammenhängt und damit es dies nicht aufgelöst wird. Aber ich weiss nicht was wirklich in deinem XML steht.

          Ok, hier mal ein paar Zeilen Code die das Problem genau beschreieben:

          <?php

          $simple = '<?xml version="1.0" encoding="UTF-8"?>
             <!DOCTYPE object [
             <!ENTITY auml "&amp;auml;">
             <!ELEMENT object (mycontent)>
             <!ELEMENT mycontent (#PCDATA)>
             ]>
             <object>
              <mycontent>Alles geht ausser Umlaute, siehe &auml;</mycontent>
             </object>
             ';

          $p = xml_parser_create("UTF-8");
          xml_parse_into_struct($p, $simple, $vals, $index);
          xml_parser_free($p);

          echo $vals[$index["MYCONTENT"][0]]["value"];

          ?>

          Als Ausgabe kommt bei mir:

          "Alles geht ausser Umlaute, siehe"

          Das ä fehlt!

          Welche PHP 4 version?
          (das liebe ich an PHP, (sogar) die (unter) Versionen sind zueinander schon M$-verdächtig inkomatibel.

          Version 4.3.5

          Ja, das liebe PHP fängt langsam an mir auch immer unsympathischer zu werden.

          Gruß,

          ueps

          1. Hallo,

            Das kommt darauf an, was für einen XML-Prozessor du verwendest. Kann dieser Entities auflösen?

            Gute Frage, verwendet wird meines Wissens Sablotron!

            Sabltron ist der XSL-Prozessor. Ein xml_parser_create() ruft normalerweise expat auf dem Plan. (kannst ja mit phpinfo nachlesen was da installiert ist)

            Du solltest auch die encoding im xml_parser_create() mitangeben.
            http://at2.php.net/manual/en/function.xml-parser-create.php

            Ja das mich schon, hab jetzt alles auf UTF-8 umgestellt.

            Wenn du das nicht wirklich brauchst, hätte ich es an deiner Stelle auf iso-8859-1 gesetzt, die default Qelencodierung und PHP ist iso.8859-1, aber auf der anderen Seite endodiert PHP ein Dokument intern immer als UTF-8.

            Ok, hier mal ein paar Zeilen Code die das Problem genau beschreieben:

            [...]

            Na ja, mit UTF-8 hat das noch nichts zu tun, du hast nach wie vor Entities. Und vor allem dur würdest in der richtigen Ausgabe ein &amul; statt ä enthalten.
            Wenn schon dann so: <!ENTITY auml "&#228;">
            Aber ich würde an deiner Stelle an solche Entities in XML verzichten.

            Hast du für dein XSLT (in der XSL-Datei)  auch eine Encoding gesetzt? oder
            http://at2.php.net/manual/en/function.xslt-set-encoding.php

            Mehr fällt mir jetzt auch nicht dazu ein, aber ich bin auch kein Expterte für PHP ;-)

            Grüße
            Thomas

            --
            Surftip: kennen Sie schon Pipolino's Clowntheater?
            http://www.clowntheater-pipolino.net/
            1. Hallo,

              Sabltron ist der XSL-Prozessor. Ein xml_parser_create() ruft normalerweise expat auf dem Plan. (kannst ja mit phpinfo nachlesen was da installiert ist)

              Ok, hab mich da vertan, für XML wird in der Tat Expat verwendet.

              ... hab jetzt alles auf UTF-8 umgestellt.

              Wenn du das nicht wirklich brauchst, hätte ich es an deiner Stelle auf iso-8859-1 gesetzt, die default Qelencodierung und PHP ist iso.8859-1, aber auf der anderen Seite endodiert PHP ein Dokument intern immer als UTF-8.

              Also ich hab es jetzt so gemacht, im XML file ist das Encoding auf UTF-8 gesetzt so bin ich vom Zeichencode nicht abhängig. Umlaute speichere ich jetzt im Format &#XXX; z.B. &#228;, d.h. in PHP ersetze ich die Zeichen entsprechend.

              Beim anschließenden parsen verwende ich als Ausgabe Encoding dann ISO-8859-1 und aus den Zahlencodes wird dann entsprechend das ä etc. gesetzt.

              Wenn schon dann so: <!ENTITY auml "&#228;">
              Aber ich würde an deiner Stelle an solche Entities in XML verzichten.

              Ja das hab ich damit auch erreicht.

              Mehr fällt mir jetzt auch nicht dazu ein, aber ich bin auch kein Expterte für PHP ;-)

              Naja, aber immerhin hast du mir gewisse Denkanstöße bezüglich des encodings gegeben und so hab ich dann eine für mich passende Lösung erarbeitet (ganz dem SELF Prinzip entsprechend ;-) )

              Gruß,

              ueps