Wie entferne ich Kommentare aus einer XML-Datei?

Wie entferne ich Kommentare aus einer XML-Datei?

Gibt es ein Kommandozeilentool, mit dem man Kommentare aus einer XML-Datei entfernen kann? Oder muss ich dazu ein kleines Programm schreiben, das einen XML-Parser verwendet?

Aktualisieren: Ich bin nicht an Lösungen interessiert, die nur eine Teilmenge aller möglichen XML-Dateien verarbeiten.

Beispielsweise kann ein regulärer Ausdruck keine XML-Analyse durchführen.

https://stackoverflow.com/questions/6751105/warum-ist-es-nicht-möglich-regex-zu-verwenden-um-html-xml-zu-parsen-eine-formale-erklärung-in-la

Antwort1

Ich würde es so machen:

cat myfile.xml | sed '/<!--.*-->/d' | sed '/<!--/,/-->/d' > cleaned.xml

Oder:

awk 'in_comment&&/-->/{sub(/([^-]|-[^-])*--+>/,"");in_comment=0}
 in_comment{next}
 {gsub(/<!--+([^-]|-[^-])*--+>/,"");
  in_comment=sub(/<!--+.*/,"");
  print}'

Oder:

xmlstarlet ed -d '//comment()' file.xml

Antwort2

Um die Antwort oben zu erweitern. Wenn Sie nur den Kommentar und nicht die gesamte Zeile löschen möchten, sollten Sie wahrscheinlich Folgendes verwenden:

sed 's/<!--.*-->//'

In meinem Fall hatte ich eine minimierte XML-Datei, bei der der gesamte Inhalt in einer einzigen Zeile stand, und da die vorherige Lösung die gesamte Zeile gelöscht hätte, in der sich der Kommentar befand, wäre meine Datei dadurch vollständig geleert worden.

Antwort3

Dies ist gut, um mehrzeilige Kommentare (wie fehlgeschlagene Tests) aus einer XML-Datei zu entfernen, zumindest die, die Sie manuell ausgewählt haben und die für den Endbenutzer hilfreich sind:
perl -i -w -0777pe 's/<!--(.(?<!(HELP|TODO)))*?-->//sg' somefile.xml

mehr zu verwandten regulären Ausdrücken:https://stackoverflow.com/a/1240293/1422630

Wenn es eine Möglichkeit gibt, mit xmlstarlet dasselbe Ergebnis zu erzielen, würde ich das vorziehen, da es möglicherweise Ausnahmen gibt, die von regulären Ausdrücken nicht verarbeitet werden können. Aber derzeit muss ich dies verwenden.

verwandte Informationen