TOM: Nochmal zwecks XML und Zeilenumbrücke

Guten Morgen Leute!

Bei mir ist jetzt es alles klar.
XML speichert meine Zeilenumbrüche als Zeilenumbrüche
ab, dass ist voll in Ordnung.
Bei der Ausgabe werden dann Zeilenumbrüche zu Leerzeichen, dass ist nicht so gut. Mein Problem
ist dass wenn ein Benutzer etwas formatiert in
ein textarea(CGI.PM) eingibt, und ich diesen
Inhalt als ein Attribut eines XML-Elements abspeichere, es bei der Ausgabe unformartiert erscheint.

Benutzer gibt z.B. ein:

1. Das ist die erste Zeile
2. Das ist die zweite Zeile

Erscheint so in meinem xml-File:
<QUESTION value="1. Das ist die erste Zeile
2. Das ist die zweite Zeile"/>

Gebe ich diesen Wert später an ein HTML-textarea zurück
erscheint (zwecks XML-Specification) folgendes:
1. Das ist die erste Zeile  2. Das ist die zweite Zeile

Das ist Müll!

Ich möchte jetzt nicht trickens und irgend einen Unsinn
in mein xml-File schreiben, da diese später einmal
per Browser betrachtet werden sollten.

Also bleibt mir anscheiend nicht anders übrig als
bei der Ausgabe per Substitution (oder ähnlichen) wieder
Zeilenumbrüche zu erzeugen, oder?

Wisst ihr was sinnvolles und vielleicht sogar elegantes.

Viele Grüße
tom

  1. Hi,

    <QUESTION value="1. Das ist die erste Zeile
    2. Das ist die zweite Zeile"/>

    [...]

    1. Das ist die erste Zeile  2. Das ist die zweite Zeile

    Das ist Müll!

    was hälst Du von

    <QUESTION>1. Das ist die erste Zeile
    2. Das ist die zweite Zeile</QUESTION>

    Da müßten die Umbrüche doch theoretisch bestehen bleiben... Oder Du kodierst sie wirklich in "<br />" o.ä. um.

    Cheatah

    1. Hi,

      <QUESTION>1. Das ist die erste Zeile
      2. Das ist die zweite Zeile</QUESTION>

      Ich denk das bleibt sich gleich. Beim Abspeichern
      hab ich keine Probleme.
      Nur halt beim Auslesen, und wenn dann XML Zeilenumbrüche
      als Leerzeichen interpretiert hab ich meine Probleme.

      Gruß
      tom

      1. Hi,

        <QUESTION>1. Das ist die erste Zeile
        2. Das ist die zweite Zeile</QUESTION>

        Ich denk das bleibt sich gleich.

        Nein. Die Umsetzung von Linefeeds in Spaces erfolgt nur innerhalb von Attributwerten (CDATA) (siehe Kapitel 3.3.3 der Spec). In normalem Text (#PCDATA) dagegen bleiben sie (fast) unveraendert (Kapitel 2.10 und 2.11 der Spec). Dies waere also eine Moeglichkeit fuer Dich.

        Allerdings verwendet man nicht ohne Grund an manchen Stellen Attributwerte in Empty Elements und an anderen Stellen eben Elements mit Mixed Content (obiger Vorschlag). In Deinem Fall scheint mir zwar letzteres ohnehin angebrachter zu sein, aber das musst Du schon selber wissen, kenne ja nicht den Rest Deiner DTD.

        Wenn man also solche besonderen Zeichen in Attributwerten verwenden will, muss man sie auf irgendein Weise maskieren. Dies kann z.B. so geschehen:

        s/([\x00-\x1F])/'$'.ord($1).';'/ge;

        Beim Auslesen dann zurueckverwandeln:

        s/$(\d+);/chr($1)/ge;

        (untestet!). Soll nichts anderes heissen als alle Character mit ASCII-Code < 32 durch die Zeichenkette "$10;" zu ersetzen, wobei die 10 fuer den ASCII-Code dieses Zeichens steht.

        HTH, Calocybe