it-swarm.com.de

Wie kann man XML von der Kommandozeile aus schön drucken?

Siehe auch: Wie kann ich JSON in einem (Unix-) Shell-Skript schön drucken?

Gibt es ein (Unix-) Shell-Skript zum Formatieren von XML in lesbarer Form?

Grundsätzlich möchte ich, dass es Folgendes umwandelt:

<root><foo a="b">lorem</foo><bar value="ipsum" /></root>

... in so etwas:

<root>
    <foo a="b">lorem</foo>
    <bar value="ipsum" />
</root>
476
svidgen

libxml2-utils

Dieses Dienstprogramm enthält libxml2-utils :

_echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xmllint --format -
_

Perls _XML::Twig_

Dieser Befehl wird mit dem Modul XML :: TwigPerl geliefert, manchmal mit dem Paket _xml-twig-tools_:

_echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xml_pp
_

xmlstarlet

Dieser Befehl wird mit xmlstarlet geliefert:

_echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xmlstarlet format --indent-tab
_

tidy

Überprüfen Sie das Paket tidy:

_echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    tidy -xml -i -
_

Python

Pythons _xml.dom.minidom_ kann XML formatieren (sowohl Python2 als auch Python3):

_echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    python -c 'import sys;import xml.dom.minidom;s=sys.stdin.read();print(xml.dom.minidom.parseString(s).toprettyxml())'
_

saxon-lint

Du brauchst saxon-lint :

_echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    saxon-lint --indent --xpath '/' -
_

saxon-HE

Du brauchst saxon-HE :

_ echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    Java -cp /usr/share/Java/saxon/saxon9he.jar net.sf.saxon.Query \
    -s:- -qs:/ '!indent=yes'
_
826
Gilles Quenot

xmllint --format yourxmlfile.xml

xmllint ist ein XML-Befehlszeilentool und in libxml2 ( http://xmlsoft.org/ ) enthalten.

==============================================

Hinweis: Wenn Sie libxml2 nicht installiert haben, können Sie es folgendermaßen installieren:

CentOS

cd /tmp
wget ftp://xmlsoft.org/libxml2/libxml2-2.8.0.tar.gz
tar xzf libxml2-2.8.0.tar.gz
cd libxml2-2.8.0/
./configure
make
Sudo make install
cd

Ubuntu

Sudo apt-get install libxml2-utils

Cygwin

apt-cyg install libxml2

MacOS

Um dies unter MacOS mit Homebrew zu installieren, gehen Sie wie folgt vor: brew install libxml2

Git

Auch auf Git verfügbar, wenn Sie den Code wollen: git clone git://git.gnome.org/libxml2

138
crmpicco

Sie können auch ordentlich verwenden, das möglicherweise zuerst installiert werden muss (z. B. unter Ubuntu: Sudo apt-get install tidy).

Dazu würden Sie etwa Folgendes ausgeben:

tidy -xml -i your-file.xml > output.xml

Hinweis: Es gibt viele zusätzliche Lesbarkeitsflags, aber das Entwirren von Zeilenumbrüchen ist etwas ärgerlich ( http://tidy.sourceforge.net/docs/quickref.html ).

35
matanster

Sie haben keine Datei erwähnt, daher gehe ich davon aus, dass Sie die XML-Zeichenfolge als Standardeingabe in der Befehlszeile bereitstellen möchten. In diesem Fall gehen Sie wie folgt vor:

$ echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xmllint --format -
13
David

xmllint unterstützt die Formatierung direkt :

for f in *.xml; do xmllint -o $f --format $f; done

Wie Daniel Veillard geschrieben hat:

Ich denke, xmllint -o tst.xml --format tst.xml sollte sicher sein, da der Parser die Eingabe vollständig in einen Baum lädt, bevor er die Ausgabe öffnet, um sie zu serialisieren.

Die Einzugsebene wird durch die Umgebungsvariable XMLLINT_INDENT gesteuert, die standardmäßig 2 Leerzeichen enthält. Beispiel, wie man den Einzug in 4 Leerzeichen ändert:

XMLLINT_INDENT='    '  xmllint -o out.xml --format in.xml

Möglicherweise fehlt die Option --recover, wenn Ihre XML-Dokumente beschädigt sind. Oder versuchen Sie es mit einem schwachen HTML-Parser mit strikter XML-Ausgabe:

xmllint --html --xmlout <in.xml >out.xml

--nsclean, --nonet, --nocdata, --noblanks usw. können nützlich sein. Lesen Sie die Manpage.

apt-get install libxml2-utils
apt-cyg install libxml2
brew install libxml2
6
gavenkoa

Ohne irgendetwas auf dem Mac zu installieren

Benutze tidy

cat filename.xml | tidy -xml -iq

Wenn Sie die Anzeige einer Datei mit cat umleiten, um den Dateityp von xml festzulegen und umzuziehen, während die Ausgabe im Hintergrund erfolgt, wird die Fehlerausgabe unterdrückt. JSON funktioniert auch mit -json.

3
jasonleonhard