Снительные комментарии из XML-файла и Pretty Print It It

StackOverflow https://stackoverflow.com/questions/1464697

  •  13-09-2019
  •  | 
  •  

Вопрос

У меня есть этот огромный 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 -d0` 'Удаляет все эти 0x0, и, чтобы отполировать его, еще один Grep удаляет пустые линии: вуаля.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top