2009-09-23 4 views
12

Ich habe diese riesige XML-Datei, die eine Menge Kommentare enthält.Streifen Kommentare von XML-Datei und Pretty-Print es

Was ist der beste Weg, um alle Kommentare zu entfernen und formatieren Sie die XML-Datei von der Linux-Befehlszeile?

+0

Mögliches Duplikat von [XML-Kommentare mit Regex in bash entfernen] (http://stackoverflow.com/questions/19230407/remove-xml-comments-using-regex-in-bash) – malat

Antwort

17

Sie ordentlich

$ tidy -quiet -asxml -xml -indent -wrap 1024 --hide-comments 1 tomcat-users.xml 
<?xml version='1.0' encoding='utf-8'?> 
<tomcat-users> 
    <user username="qwerty" password="ytrewq" roles="manager-gui" /> 
</tomcat-users> 
+0

Fügen Sie den Parametern "-modify" hinzu, um die Datei an Ort und Stelle zu ändern. (Sie haben ein Backup gemacht, oder?) –

7

Sie können sich das Tool xmllint ansehen. Es hat mehrere Optionen (eine von denen --format wird einen schönen Druck), aber ich kann nicht herausfinden, wie Sie die Kommentare mit diesem Tool entfernen.

Überprüfen Sie auch XMLStarlet, eine Reihe von Befehlszeilen-Tools zu tun, was Sie mit XML möchten. Dann tun:

xml c14n --without-comments # XML file canonicalization w/o comments 

EDIT: OP schließlich diese Zeile verwendet:

xmlstarlet c14n --without-comments old.xml > new.xml 
+0

xmllint ist eine cmdline-Schnittstelle zu libxml2 eine Bibliothek mit Bindings für viele Sprachen. Z.B. Ich benutze XML :: LibXML in Perl. – reinierpost

+0

Ich benutze immer: xmlstarlet c14n --without-Kommentare old.xml> new.xml – elcuco

-2

Der beste Weg wäre, einen XML-Parser zu verwenden, um alle dunklen Ecke Fälle zu behandeln, richtig. Aber wenn Sie etwas schnell und schmutzig brauchen, gibt es eine Vielzahl von short solutions using Perl regexes, die ausreichen können.

+3

Verwenden Sie keine Regexes auf XML. – reinierpost

+0

@reinierpost: Ich verstehe, warum diese Antwort widerwärtig scheint.Aber wenn das ein einmaliger Fall ist und Sie wissen, dass Ihre Kommentare eine gut eingeschränkte Teilmenge der Kommentarspezifikation sind, was stimmt dann nicht mit einer Regex-Lösung? Ich stimme zu, ein Parsing-Tool ist vorzuziehen (und ist die beste Antwort), aber ich denke, das ist eine gültige Alternative in bestimmten Situationen (z. B. einfaches Testen oder 2AM Krise Callouts auf einem schreibgeschützten System), und kann sehr praktisch sein . –

+0

Mit einem gültigen XML und daher nur Kommentare, die Kommentare sind, denke ich, ein XML-Parser ist besser. Wenn Sie jedoch HTML mit Kommentaren bearbeiten, die Bedingungen enthalten (z. B. Internet Explorer), ist eine Regex wahrscheinlich die beste Wahl. –

10

Führen Sie Ihr XML über eine identity transform XSLT mit einer leeren Vorlage für Kommentare.

Der gesamte XML-Inhalt, mit Ausnahme der Kommentare, wird an die Ausgabe übergeben.

Um niecely das Ausgabeformat, stellen Sie den Ausgang @ indent = "yes":

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<!--Match on Attributes, Elements, text nodes, and Processing Instructions--> 
<xsl:template match="@*| * | text() | processing-instruction()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<!--Empty template prevents comments from being copied into the output --> 
<xsl:template match="comment()"/> 

</xsl:stylesheet> 
0

aufzuräumen etwas Einfaches wie Tomcat server.xml verwenden können , verwende ich

sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$" 

Ie

function tidy() { 
echo "$(cat $1 | sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$")" 
} 

tidy server.xml 

... wird die XML ohne Kommentare drucken.

HINWEIS: Während es für einfache Dinge recht gut funktioniert, wird es mit bestimmten CDATA-Blöcken und einigen anderen Situationen fehlschlagen. Verwenden Sie es nur für kontrollierte xml-Skripte, die keine Notwendigkeit haben und niemals eine einzige <-- oder --> irgendwo entkommen müssen!

Zuerst sed Markenkommentar starten und stoppen mit 0x0 Zeichen, dann grep mit -z behandelt 0x0 als einzige Zeilenbegrenzer, sucht nach Zeilen beginnend mit Kommentar, es ist -v invertiert den Filter und nur aussagekräftige Zeilen. Schließlich löscht tr -d \ 0` alle diese 0x0, und um es aufzupolieren, entfernt ein anderes Grep leere Zeilen: voila.