удалите комментарии из xml-файла и pretty-print

У меня есть огромный XML-файл, который содержит много комментариев.

каков "лучший способ" удалить все комментарии и красиво отформатировать xml из командной строки linux?

5 ответов


вы можете использовать tidy

$ 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>

запустите XML через идентификационными данными, преобразовывают XSLT, с пустым шаблоном для комментариев.

все содержимое XML, за исключением комментариев, будет передано в выходные данные.

для того, чтобы отформатировать вывод, установите output @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>

вы можете посмотреть на . Оно имеет несколько вариантов (один из которых --format сделает довольно печать), но я не могу понять, как удалить комментарии с помощью этого инструмента.

кроме того, проверьте XMLStarlet куча инструментов командной строки, чтобы сделать все, что вы хотели бы с XML. Тогда сделай:

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

редактировать: OP в конечном итоге использовал эту строку:

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

чтобы убрать что-то простое, как сервер Tomcat.xml, я использую

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

т. е.

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

tidy server.xml

... печать XML без комментариев.

Примечание: хотя он работает достаточно хорошо для простых вещей, он потерпит неудачу с некоторыми блоками CDATA и некоторыми другими ситуациями. Используйте его только для управляемых XML-скриптов, которые не нуждаются и никогда не будут нуждаться в побеге одного <-- или --> в любом месте!

первый sed отмечает начало и остановку комментария с символами 0x0, затем grep с -z обрабатывает 0x0 как единственный разделитель строк, ищет строки, начинающиеся с комментария, это-V инвертирует фильтр, оставляя только значимые строки. Наконец,tr -d\0 ' удаляет все эти 0x0, и чтобы отполировать его, другой grep удаляет пустые строки: voila.


лучшим способом было бы использовать синтаксический анализатор XML для правильной обработки всех неясных угловых случаев. Но если вам нужно что-то быстрое и грязное, существует множество короткие решения с использованием Perl regexes что может быть достаточно.