Sanjoy: XML Verarbeitungsfehler in Zusammenhang mit  

Hallo liebe Helfer,

ich habe ein php Script, dass mir eine XML Datei erstellt. Wenn ich die XML Datei anschließend mit beispielsweise Firefox öffne, meldet er folgenden Fehler:
XML-Verarbeitungsfehler: Undefinierte Entität
Adresse: http://local.test.de/xml.php?id=1
Zeile Nr. 75, Spalte 40:
          <field name="Primärtherapie">&nbsp;</field>
---------------------------------------^

Anscheinend habe ich es nicht verstanden, aber ich dachte "&nbsp;" wäre eine "Generelle Entität" (heißt doch so, oder?).
Wo liegt mein Verständnisfehler?

Vielen Dank und lieben Gruß
Sanjoy

  1. Hallo!

    Anscheinend habe ich es nicht verstanden, aber ich dachte "&nbsp;" wäre eine "Generelle Entität" (heißt doch so, oder?).
    Wo liegt mein Verständnisfehler?

    Kurze Antwort: Schriebe &#160;

    Lange Antwort: Die einzigen Entities, die XML vordefiniert, sind &amp; &lt; &gt; und &quot;. Alles andere musst Du erst einmal als NCR (&#...; oder &#x...;) angeben. Da zählt auch &nbsp; dazu. Du kannst Dir natürlich eine Entity &nbsp; definieren in Deiner DTD, das wird Dir aber in Mozilla-Produkten nichts nützen, da diese keinen validierenden Parser einsetzen und somit die Entity nicht auflösen. Und zudem den XML-Standard darin verletzen, dass sie - obwohl sie *nicht* validieren - die Entity nicht wenigstens einfach als "Entity Reference"-Knoten in den DOM-Baum einfügen und bei der Ausgabe ignorieren, sondern fälschlicherweise einen Parserfehler ausgeben. Oder kurz zusammengefasst: Eigene Entities in XML + Mozilla = Knallt und die Mozilla-Leute haben kein Interesse das auf die eine oder andere Weise zu fixen (entweder Parser validierend machen oder eben keinen Fehler ausspucken, wenn eine Entity unbekannt ist).

    Viele Grüße,
    Christian

    1. Vielen Dank für eure Hilfe!

    2. Hi,

      Lange Antwort: Die einzigen Entities, die XML vordefiniert, sind &amp; &lt; &gt; und &quot;.

      Korrektur: und &apos; (die einfachen Anführungsstriche werden also nicht mehr gegenüber den zweifachen &quot; Anführungsstrichen benachteiligt)

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    3. @@Christian Seiler:

      Kurze Antwort: Schriebe &#160;

      Besser: Schreibe &#xA0;

      Wennschon numerische Referenzen, dann doch bitte hexadezimal ...

      Live long and prosper,
      Gunnar

      --
      Erwebsregel 208: Manchmal ist das einzige, was gefährlicher als eine Frage ist, eine Antwort.
  2. Unicode?

    &#160; anstatt &nbsp;

    1. Unicode?
      &#160; anstatt &nbsp;

      das ist kein unicode sondern eine nummerische referenz auf ein unicode-zeichen - das hier ist ist das gewünscht zeichen [ ] (zwischen den eckigen klammern als kopiervorlage :p)

  3. Adresse: http://local.test.de/xml.php?id=1

    ich denke, dass die stiftung warentest darüber nicht begeistert ist, dass du auf derern domain herumtesttest - korrigiere mich, wenn ich falsch liege ;)

    <http://www.rfc-editor.org/rfc/rfc2606.txt Abschnitt 3> dürfte dich interessieren

    <field name="Primärtherapie">&nbsp;</field>
    ---------------------------------------^

    Anscheinend habe ich es nicht verstanden, aber ich dachte "&nbsp;" wäre eine "Generelle Entität" (heißt doch so, oder?).

    nein, &nbsp; ist ein html-entität - mit xml hat das wenig zu tun

    hier ist, soweit ich im kopf habe, lediglich gt; &lt; &amp; &quot; sowie &apos; definiert - mit korrekter zeichencodierung besteht für andere entities oder nummerische referenzen keine notwenigkeit

    Wo liegt mein Verständnisfehler?

    einerseits versuchst du &nbsp; als platzhalter für einen leeren wert zu verwenden

    was spricht gegen
    <field name="Primärtherapie"></field>
    oder
    <field name="Primärtherapie" />
    oder
    <field name="Primärtherapie">NULL</field>

    andererseits wäre, wenn du wirklich ein geschützes leerzeichen verwenden willst, eben dieses zeichen das richtige

    U+00A8 oder dezimal ausgedrückt 160, also dieses hier ' ' das richtige zeichen

    1. U+00A8

      korrektur U+00A0

      1. Vielen Dank!

    2. @@suit:

      hier ist, soweit ich im kopf habe, lediglich gt; &lt; &amp; &quot; sowie &apos; definiert

      Kein Loch im Kopf. ;-)

      mit korrekter zeichencodierung besteht für andere entities oder nummerische referenzen keine notwenigkeit

      Doch, gerade beim no-break space ist escapen durchaus sinnvoll. ([QA-ESCAPES]: Unsichtbare oder nicht unterscheidbare Zeichen)

      Live long and prosper,
      Gunnar

      --
      Erwebsregel 208: Manchmal ist das einzige, was gefährlicher als eine Frage ist, eine Antwort.
      1. Doch, gerade beim no-break space ist escapen durchaus sinnvoll. ([QA-ESCAPES]: Unsichtbare oder nicht unterscheidbare Zeichen)

        mit einem vernünftigen editor lassen sich unsichtbare zeichen aber durchaus anzeigen - ich bevorzuge diese variante ;)

  4. "kaputt" := {

    • xsltproc beschwert sich nach einer nachträglichen ENTITY Deklaration zu "nbsp" in einem Dump von phpinfo() über "Opening and ending tag mismatch"

    • (DOMDocument) $dom->loadXML($xml_str) meckert ähnlich wenn "&nbsp;" im phpinfo()-Output (in $xnl_str) durch "&#160;" oder "&#0xA0;" oder chr(160) ersetzt wurde; und zwar unabhängig davon, ob das Dokument "UTF-8" od. "ISO-8859-1" deklariert wurde und ob und wann ein utf8_encode passiert ist.

    }

    Mittlerweile habe ich wohl alle Reihenfolgen und Kombinationen von encoding, utf8_de/encode und str_replace("&nbsp;") durchgetestet aber phpinfo() "will" offenbar weder mit noch ohne "&nbsp;" & Co. ins DOM(?)

    Ein Dreizeiler mit php_info(), str_replace() o.ä. und einem dann erfolgreichen loadXML wäre überaus hilfreich!

    Grüsse

    Solkar