相关:如何在(unix) shell脚本漂亮打印JSON ?

是否有(unix) shell脚本以人类可读的形式格式化XML ?

基本上,我想要它转换如下:

<root><foo a="b">lorem</foo><bar value="ipsum" /></root>

…变成这样:

<root>
    <foo a="b">lorem</foo>
    <bar value="ipsum" />
</root>

当前回答

yq可以用来打印XML。 它有一个定义缩进的选项。

yq --input-format xml --output-format xml --indent 2

其他回答

无需在macOS /大多数Unix上安装任何东西。

使用整洁

Cat filename.xml | tidy -xml -iq .xml

使用cat重定向查看文件,指定xml文件类型为tidy,并在安静输出时缩进,将抑制错误输出。JSON也可以使用-json。

您没有提到文件,所以我假设您想在命令行上提供XML字符串作为标准输入。在这种情况下,请执行以下操作:

$ echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xmllint --format -

xmllint

这个实用程序附带libxml2-utils:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xmllint --format -

Perl的XML::树枝

这个命令附带了XML::Twig perl模块,有时是XML - Twig -tools包:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xml_pp

xmlstarlet

这个命令附带xmlstarlet:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xmlstarlet format --indent-tab

tidy

检查整齐的包装:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    tidy -xml -i -

Python

Python的XML .dom.minidom可以格式化XML(也适用于遗留的python2):

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    python -c 'import sys; import xml.dom.minidom; s=sys.stdin.read(); print(xml.dom.minidom.parseString(s).toprettyxml())'

saxon-lint

你需要撒克逊棉:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    saxon-lint --indent --xpath '/' -

saxon-HE

你需要saxon-HE:

 echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    java -cp /usr/share/java/saxon/saxon9he.jar net.sf.saxon.Query \
    -s:- -qs:/ '!indent=yes'

我花了很长时间才找到能在我的mac上运行的软件。以下是对我有效的方法:

brew install xmlformat
cat unformatted.html | xmlformat

你也可以使用tidy,它可能需要先安装(例如在Ubuntu上:sudo apt-get install tidy)。

为此,您可以发布如下内容:

tidy -xml -i your-file.xml > output.xml

注意:有许多额外的可读性标志,但是换行行为有点烦人(http://tidy.sourceforge.net/docs/quickref.html)。