enlever les commentaires de fichier xml et joli imprimer
Question
J'ai ce grand fichier XML qui contient beaucoup de commentaires.
Quelle est la « meilleure façon » de dépouiller tous les commentaires et le format xml bien à partir de la ligne de commande linux?
La solution
vous pouvez utiliser bien rangé
$ 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>
Autres conseils
Lancez votre XML à travers un XSLT, avec un modèle vide pour commentaires.
Tout le contenu XML, sauf pour les commentaires, seront transmises à la sortie.
Pour formater niecely la sortie, réglez le tiret sortie @ = "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>
Vous pouvez regarder l'outil xmllint
. Il dispose de plusieurs options (dont --format
fera une jolie impression), mais je ne peux pas comprendre comment supprimer les commentaires à l'aide de cet outil.
En outre, consultez xmlstarlet , un tas d'outils de ligne de commande pour faire ce que vous voulez avec xml. Ensuite, faites:
xml c14n --without-comments # XML file canonicalization w/o comments
EDIT : OP éventuellement utilisé cette ligne:
xmlstarlet c14n --without-comments old.xml > new.xml
Pour ranger quelque chose de simple comme le server.xml de Tomcat, j'utilise
sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$"
i.e..
function tidy() {
echo "$( cat $1 | sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$")"
}
tidy server.xml
... imprimera le xml sans commentaires.
NOTE: alors qu'il fonctionne raisonnablement bien pour des choses simples, il échouera avec certains blocs CDATA et d'autres situations. Utilisez uniquement pour les scripts XML contrôlés qui ont pas besoin et ne sera jamais besoin d'échapper à un seul <--
ou -->
partout!
marque le premier sed commentaire de début et arrêter avec des personnages de 0x0, puis grep avec -z
traite 0x0 comme séparateur seule ligne, recherche des lignes commençant par un commentaire, il est -v le filtre intervertit, laissant des lignes significatives seulement. Enfin, tr -d
\ 0` supprime tous ces 0x0, et de le polir, une autre grep supprime les lignes vides. Le tour est joué
La meilleure façon serait d'utiliser un analyseur XML pour traiter tous les cas de coin obscur correctement. Mais si vous avez besoin quelque chose de rapide et sale, il y a une variété de solutions à court en utilisant Perl Regexes qui peut être suffisant.