XML Syntax mit Zeilenumbruch und Einrückung ?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anfang
anzeige
array
ausgabe
check
code
dank
detail
element
ergebnis
farbe
header
kennen
knoten
quellcode
string
syntax
tab
text
type
-
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 ?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
<?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] = " "."<item>"."<br>"; $ersetzungen[2] = " "."<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... . -
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 -
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] = " "."<item>"."<br>"; $ersetzungen[2] = " "."<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> <item><br> <name><br>Donald<br></name><br><details<br><type><br>Duck<br></type><br><age><br>36<br></age><br></details><br></item><br> <item><br> <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] = " "."<item>"."<br>"; $ersetzungen[2] = " "."<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> <item><br> <name><br>Donald<br></name><br><details<br><type><br>Duck<br></type><br><age><br>36<br></age><br></details><br></item><br> <item><br> <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? -
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 -
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!
-
$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>
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage