kostenloser Webspace werbefrei: lima-city


XML Syntax mit Zeilenumbruch und Einrückung ?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    rabatto

    rabatto hat kostenlosen Webspace.

    Hallo

    ich habe eine String wie folgendes Beispiel:

    $string = '
    <root><item><name>Donald</name><details><type>Duck</type><age>36</age></details></item><item><name>Mickey</name><details><type>Mouse</type><age>27</age></details></item></root>
    ';



    habe es mit str_replace() versucht, aber damit kommen nur Zeilenumbrüche

    $string = str_replace('><',">\n<",$string);


    Ergebnis:
    $string = '
    <root>
    <item>
    <name>Donald</name>
    <details>
    <type>Duck</type>
    <age>36</age>
    </details>
    </item>
    <item>
    <name>Mickey</name>
    <details>
    <type>Mouse</type>
    <age>27</age>
    </details>
    </item>
    </root>
    ';


    wie kann ich es machen, dass die Elemente auch
    entsprechend ihrer Ebene eingerückt sind ? ... mit TABs oder Leerzeichen

    BSP:
    $string = '
    <root>
      <item>
        <name>Donald</name>
        <details>
            <type>Duck</type>
            <age>36</age>
        </details>
      </item>
      <item>
        <name>Mickey</name>
        <details>
            <type>Mouse</type>
            <age>27</age>
        </details>
      </item>
    </root>
    ';


    also jede Ebene soll um 1 TABs \t (oder je 2 Lerzeichen) weiter eingerückt
    werden, und gleiche Ebenen auf gleicher "Tiefe" stehen ... siehe BSP

    wie machen .. mit Pattern (Welcher?) und preg_replace ?
    ... oder gibt es eine "bessere" Methode ?

  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. <?php
    $string = "<root><item><name>Donald</name><details><type>Duck</type><age>36</age></details></item><item><name>Mickey</name><details><type>Mouse</type><age>27</age></details></item></root>";
    
    $suchmuster = array();
    $suchmuster[0] = "/<root>/";
    $suchmuster[1] = "/<item>/";
    $suchmuster[2] = "/<name>/";
    $suchmuster[3] = "/<details>/";
    $suchmuster[4] = "/<type>/";
    $suchmuster[5] = "/<age>/";
    $suchmuster[6] = "/<\/root>/";
    $suchmuster[7] = "/<\/item>/";
    $suchmuster[8] = "/<\/name>/";
    $suchmuster[9] = "/<\/details>/";
    $suchmuster[10] = "/<\/type>/";
    $suchmuster[11] = "/<\/age>/";
    
    $ersetzungen = array();
    $ersetzungen[0] = "<root><br>";
    $ersetzungen[1] = "&nbsp;&nbsp;"."<item>"."<br>";
    $ersetzungen[2] = "&nbsp;&nbsp;"."<name>"."<br>";
    $ersetzungen[3] = "<br>"."<details"."<br>";
    $ersetzungen[4] = "<type>"."<br>";
    $ersetzungen[5] = "<br>"."<age>"."<br>";
    $ersetzungen[6] = "<br>"."</root>";
    $ersetzungen[7] = "<br>"."</item>"."<br>";
    $ersetzungen[8] = "<br>"."</name>";
    $ersetzungen[9] = "<br>"."</details>";
    $ersetzungen[10] = "<br>"."</type>";
    $ersetzungen[11] = "<br>"."</age>";
    
    echo "<pre>".preg_replace($suchmuster, $ersetzungen, $string)."</pre>";
    ?>


    Hmmm, leider werden trotz "pre" nicht die xml Dinge wie </age> etc. angezeigt... .
    Das Ergebnis wäre:
    Donald
    
    
    Duck
    
    
    36
    
    
    
      
      
    Mickey
    
    
    Mouse
    
    
    27


    Naja vll. schonmal ein Anfang für die Lösung.
    Aber preg_replace, hätte ich aufjedenfall mal vorgeschlagen. Mir fällt zumindest keine Andere Möglichkeit ein... .
  4. Autor dieses Themas

    rabatto

    rabatto hat kostenlosen Webspace.

    Danke

    aber ich bräuchte eine Lösung, bei der man nicht jedes Feld vorher kennen muss
    ... also so, dass es für jeden x-beliebigen XML oder HTML Code funktioniert


    das mit dem <pre> ist kein Problem,
    man kann es ja als reinen Text (ohne <pre> drum herum) ausgeben
    mit:

    header("Content-Type: text/plain; charset=utf-8"); 
    print $code_string;


    oder ... als html Ausgabe z.B. so machen

    print '<pre>'."\n"; 
    print htmlentities(print_r($code_string,true));
    print '</pre>'."\n";


    ... gibt es in PHP nicht einfach sowas wie Syntax-Highlighting
    was aber nur die Einrückungen macht, und keine Farben, etc.



    Beitrag zuletzt geändert: 1.2.2014 14:04:53 von rabatto
  5. print '<pre>'."\n"; 
    print htmlentities(print_r($code_string,true));
    print '</pre>'."\n";


    so klappt das aber leider auch nicht wircklich.

    Im gesamten Code wäre es ja dann:
    <?php
    $string = "<root><item><name>Donald</name><details><type>Duck</type><age>36</age></details></item><item><name>Mickey</name><details><type>Mouse</type><age>27</age></details></item></root>";
    
    $suchmuster = array();
    $suchmuster[0] = "/<root>/";
    $suchmuster[1] = "/<item>/";
    $suchmuster[2] = "/<name>/";
    $suchmuster[3] = "/<details>/";
    $suchmuster[4] = "/<type>/";
    $suchmuster[5] = "/<age>/";
    $suchmuster[6] = "/<\/root>/";
    $suchmuster[7] = "/<\/item>/";
    $suchmuster[8] = "/<\/name>/";
    $suchmuster[9] = "/<\/details>/";
    $suchmuster[10] = "/<\/type>/";
    $suchmuster[11] = "/<\/age>/";
    
    $ersetzungen = array();
    $ersetzungen[0] = "<root><br>";
    $ersetzungen[1] = "&nbsp;&nbsp;"."<item>"."<br>";
    $ersetzungen[2] = "&nbsp;&nbsp;"."<name>"."<br>";
    $ersetzungen[3] = "<br>"."<details"."<br>";
    $ersetzungen[4] = "<type>"."<br>";
    $ersetzungen[5] = "<br>"."<age>"."<br>";
    $ersetzungen[6] = "<br>"."</root>";
    $ersetzungen[7] = "<br>"."</item>"."<br>";
    $ersetzungen[8] = "<br>"."</name>";
    $ersetzungen[9] = "<br>"."</details>";
    $ersetzungen[10] = "<br>"."</type>";
    $ersetzungen[11] = "<br>"."</age>";
    
    $code_string = preg_replace($suchmuster, $ersetzungen, $string);
    print '<pre>'."\n"; 
    print htmlentities(print_r($code_string,true));
    print '</pre>'."\n";
    ?>


    So und dadurch würde man den preg replace umsonst machen, da es wieder eine einfache Zeichenkette ist.

    Das Ergebnis wäre folglich:
    <root><br>&nbsp;&nbsp;<item><br>&nbsp;&nbsp;<name><br>Donald<br></name><br><details<br><type><br>Duck<br></type><br><age><br>36<br></age><br></details><br></item><br>&nbsp;&nbsp;<item><br>&nbsp;&nbsp;<name><br>Mickey<br></name><br><details<br><type><br>Mouse<br></type><br><age><br>27<br></age><br></details><br></item><br><br></root>


    und ohne pre:
    <?php
    $string = "<root><item><name>Donald</name><details><type>Duck</type><age>36</age></details></item><item><name>Mickey</name><details><type>Mouse</type><age>27</age></details></item></root>";
    
    $suchmuster = array();
    $suchmuster[0] = "/<root>/";
    $suchmuster[1] = "/<item>/";
    $suchmuster[2] = "/<name>/";
    $suchmuster[3] = "/<details>/";
    $suchmuster[4] = "/<type>/";
    $suchmuster[5] = "/<age>/";
    $suchmuster[6] = "/<\/root>/";
    $suchmuster[7] = "/<\/item>/";
    $suchmuster[8] = "/<\/name>/";
    $suchmuster[9] = "/<\/details>/";
    $suchmuster[10] = "/<\/type>/";
    $suchmuster[11] = "/<\/age>/";
    
    $ersetzungen = array();
    $ersetzungen[0] = "<root><br>";
    $ersetzungen[1] = "&nbsp;&nbsp;"."<item>"."<br>";
    $ersetzungen[2] = "&nbsp;&nbsp;"."<name>"."<br>";
    $ersetzungen[3] = "<br>"."<details"."<br>";
    $ersetzungen[4] = "<type>"."<br>";
    $ersetzungen[5] = "<br>"."<age>"."<br>";
    $ersetzungen[6] = "<br>"."</root>";
    $ersetzungen[7] = "<br>"."</item>"."<br>";
    $ersetzungen[8] = "<br>"."</name>";
    $ersetzungen[9] = "<br>"."</details>";
    $ersetzungen[10] = "<br>"."</type>";
    $ersetzungen[11] = "<br>"."</age>";
    
    $code_string = preg_replace($suchmuster, $ersetzungen, $string);
    print htmlentities(print_r($code_string,true));
    ?>


    wäre das Ergebnis:
    <root><br>&nbsp;&nbsp;<item><br>&nbsp;&nbsp;<name><br>Donald<br></name><br><details<br><type><br>Duck<br></type><br><age><br>36<br></age><br></details><br></item><br>&nbsp;&nbsp;<item><br>&nbsp;&nbsp;<name><br>Mickey<br></name><br><details<br><type><br>Mouse<br></type><br><age><br>27<br></age><br></details><br></item><br><br></root>


    sprich das selbe Ergebnis nur die Schriftart ist anderst... .



    Von einem Syntax Highlighting in php habe ich leider noch nie etwas gehört aber vll. kennt wer eine passende library?
  6. Also mir ist noch etwas unklar:
    Soll die Anzeige anschliessend im Browser einfach korrekt sein oder willst du die Anzeige schon in deinem Code so?

    Für ersteres habe ich folgenden Header den ich sende:
    header('Content-Type: text/xml; charset=utf-8'); // sorgt für die korrekte XML-Kodierung
    header('Cache-Control: must-revalidate, pre-check=0, no-store, no-cache, max-age=0, post-check=0'); // ist mal wieder wichtig wegen IE


    funktioniert bei mir im Opera wunderbar (Elemente werden eingerückt dargestellt).

    Für die Darstellung im PHPCode wird es wohl keine optimale Lösung geben, aber warum erstellst du dein XML nicht mit der DOMDocument-Klasse? Finde ich persönlich sehr simple und wäre wohl auch übersichtlicher.

    Gruess

    Beitrag zuletzt geändert: 1.2.2014 15:27:43 von meron
  7. Autor dieses Themas

    rabatto

    rabatto hat kostenlosen Webspace.

    Hallo

    die Ausgabe des Code in HTML (mit <pre>) ist mir ziemlich egal ...
    ... bzw das bekome ich dann selber hin ... darum geht es NICHT

    es geht um Einrückungen bei (plain/raw) Code, zum "sauber" speichern

    ich will auch kein Suchmuster mit so einem array() für das man
    ja vorher alle Elemente (Knoten) und deren Ebene kennen müsste
    (... sorry ... das finde ich einen unbrauchbaren Ansatz)

    ich will ein (Regex) Pattern, (oder wenn es gibt andere Möglichkeit)
    welches ich auf beliebigen XML oder HTML Code anwenden kann
    ohne die Tags / Elemente / Knoten / Ebenen ... vorher zu kennen.

    also bitte nicht vom Thema abkommen,
    ich will nix über header Content-Type oder <pre> Ausgabe wissen,
    sondern ich suche einfach nur eine Möglichkeit, wie man Quellcode
    sauber einrücken kann, so dass jede "Ebene" am Anfang der Zeile
    entsprechende Tabs (bzw. Leerzeichen) bekommt.
    ... siehe ganz oben mein BSP ...


    also bitte beim Thema bleiben, ich brauch nix zu header('Content-Type...')
    und auch nix zu Ausgabe in HTML mit <pre> oder andere "sekundäre Dinge
    sondern nur den (Regex) Pattern, (oder wenn es gibt andere Möglichkeit)
    um im Quellcode die Einrückungen hin zu bekommen.


    anders gesagt .. sowas wie ein Syntax-Highlighting,
    aber ohne Farben oder andere Formatierungen
    sondern einfach nur die Einrückungen ... egal ob TABs oder Leerzeichen
    nicht mehr

    Danke!

  8. $string = '<root><item><name>Donald</name><details><type>Duck</type><age>36</age></details></item><item><name>Mickey</name><details><type>Mouse</type><age>27</age></details></item></root>';
    
    $xml = new DOMDocument();
    $xml->loadXML($string,LIBXML_NOBLANKS);
    $xml->formatOutput = true;
    echo $xml->saveXML();

    Ausgabe:
    <?xml version="1.0"?>
    <root>
      <item>
        <name>Donald</name>
        <details>
          <type>Duck</type>
          <age>36</age>
        </details>
      </item>
      <item>
        <name>Mickey</name>
        <details>
          <type>Mouse</type>
          <age>27</age>
        </details>
      </item>
    </root>
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!