Подтвердить что ты не робот

Отлаживать комментарии из xml файла и довольно-печатать его

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

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

4b9b3361

Ответ 1

вы можете использовать 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>

Ответ 2

Запустите свой 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>

Ответ 3

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

Кроме того, проверьте XMLStarlet, набор инструментов командной строки, чтобы делать все, что вы хотели бы с помощью xml. Затем выполните:

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

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

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

Ответ 4

Чтобы убрать что-то простое, например Tomcat server.xml, я использую

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

т.е.

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

tidy server.xml

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

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

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

Ответ 5

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