Снительные комментарии из XML-файла и Pretty Print It It
Вопрос
У меня есть этот огромный XML -файл, который содержит много комментариев.
Какой «лучший способ» вычеркнуть все комментарии и хорошо отформатировать XML из командной строки Linux?
Решение
Вы можете использовать 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 @addent = "Да":
<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>
Вы можете посмотреть на xmllint
инструмент. У него есть несколько вариантов (один из которых --format
сделает красивую печать), но я не могу понять, как удалить комментарии, используя этот инструмент.
Также проверьте Xmlstarlet, куча инструментов командной строки, чтобы сделать все, что вы хотели бы с XML. Тогда делай:
xml c14n --without-comments # XML file canonicalization w/o comments
РЕДАКТИРОВАТЬ: OP в конце концов использовал эту линию:
xmlstarlet c14n --without-comments old.xml > new.xml
Чтобы укрепить что -то простое, например, Server.xml Tomcat's, я использую
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 Marks Comment's Start and Stop с символами 0x0, затем Grep с -z
Обращается 0x0 как единственное разделитель строки, ищет строки, начинающиеся с комментариев, это -v инвертирует фильтр, оставляя только значимые строки. Окончательно, tr -d
0` 'Удаляет все эти 0x0, и, чтобы отполировать его, еще один Grep удаляет пустые линии: вуаля.
Лучшим способом было бы использовать анализатор XML для правильного обработки всех неясных угловых чехлов. Но если вам нужно что -то быстрое и грязное, есть множество Короткие решения с использованием режимов Perl что может быть достаточно.