666 Stimmen

Wie man XML von der Befehlszeile aus schöner formatiert?

Zugehörig: Wie kann ich JSON in einem (Unix) Shell-Skript schön formatiert ausgeben?

Gibt es ein (Unix) Shell-Skript, um XML in einer menschenlesbaren Form zu formatieren?

Im Grunde genommen möchte ich, dass es das Folgende transformiert:

lorem

... in etwas Ähnliches wie dies:

    lorem

0voto

SnacOverflow Punkte 3049

Bearbeiten:

Haftungsausschluss: Sie sollten in der Regel bevorzugen, ein ausgereiftes Werkzeug wie xmllint zu installieren, um eine Aufgabe wie diese zu erledigen. XML/HTML kann eine schrecklich verstümmelte Angelegenheit sein. Es gibt jedoch gültige Situationen, in denen die Verwendung bestehender Werkzeuge vorzuziehen ist, anstatt neue manuell zu installieren, und wo es auch eine sichere Wette ist, dass die Quelle des XMLs gültig (genug) ist. Ich habe dieses Skript für einen dieser Fälle geschrieben, aber sie sind selten, also gehen Sie mit Vorsicht vor.


Ich möchte eine reine Bash-Lösung hinzufügen, da es nicht 'so' schwierig ist, es einfach von Hand zu machen, und manchmal möchten Sie möglicherweise kein zusätzliches Werkzeug installieren, um die Aufgabe zu erledigen.

#!/bin/bash

declare -i currentIndent=0
declare -i nextIncrement=0
while read -r line ; do
  currentIndent+=$nextIncrement
  nextIncrement=0
  if [[ "$line" == "*}"
    dirtyTagName="${dirtyStartTag%% *}"
    tagName="${dirtyTagName//" && ! "$line" == *"/>"  ]]; then
      nextIncrement+=1
    fi
  fi

  # Drucken mit Einzug
  printf "%*s%s" $(( $currentIndent * 2 )) # Leerzeichen für die Einrückungszahl drucken
  echo $line
done <<< "$(cat - | sed 's/>\n< mit Zeilenumbruch

Fügen Sie es in eine Skriptdatei ein und leiten Sie das XML ein. Dies setzt voraus, dass das XML auf einer Zeile steht und nirgendwo zusätzliche Leerzeichen vorhanden sind. Man könnte leicht etwas zusätzliches \s* zu den Regexen hinzufügen, um das zu beheben.

0voto

Nicholas Saunders Punkte 513

Ich würde:

nicholas@mordor:~/flwor$ 
nicholas@mordor:~/flwor$ cat ugly.xml 

lorem

nicholas@mordor:~/flwor$ 
nicholas@mordor:~/flwor$ basex
BaseX 9.0.1 [Standalone]
Versuchen Sie 'help', um weitere Informationen zu erhalten.
> 
> create database pretty
Datenbank 'pretty' erstellt in 231.32 ms.
> 
> open pretty
Datenbank 'pretty' wurde in 0.05 ms geöffnet.
> 
> set parser xml
PARSER: xml
> 
> add ugly.xml
Ressource(n) in 161.88 ms hinzugefügt.
> 
> xquery .

  lorem

Abfrage ausgeführt in 179.04 ms.
> 
> exit
Viel Spaß.
nicholas@mordor:~/flwor$ 

wenn nur weil es dann "in" einer Datenbank ist, und nicht nur "eine" Datei. Einfacher zu handhaben, meiner Meinung nach.

Abonnieren Sie die Überzeugung, dass andere dieses Problem bereits gelöst haben. Wenn Sie möchten, könnte eXist zweifellos sogar "besser" beim Formatieren von xml sein, oder zumindest genauso gut.

Sie können die Daten natürlich immer auf verschiedene Arten abfragen. Ich habe es so einfach wie möglich gehalten. Sie können auch einfach eine GUI verwenden, aber Sie haben die Konsole angegeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X