关于Unix:如何从命令行漂亮地打印XML?

How to pretty print XML from the command line?

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

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

基本上,我希望它转换以下内容:

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

…变成这样:

1
2
3
4
<root>
    <foo a="b">lorem</foo>
    <bar value="ipsum" />
</root>


libxml2-utils

此实用程序随libxml2-utils一起提供:

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

Perl的XML::Twig

此命令随xml::twig perl模块一起提供,有时是xml-twig-tools包:

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

xmlstarlet

此命令随xmlstarlet一起提供:

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

tidy

检查tidy包:

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

Python

python的xml.dom.minidom可以格式化xml(python2和python3两种格式):

1
2
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

您需要saxon-lint

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

saxon-HE

您需要saxon-HE

1
2
3
 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'


xmllint --format yourxmlfile.xml

xmllint是一个命令行XML工具,包含在libxml2中(http://xmlsoft.org/)。

=====================================

注意:如果您没有安装libxml2,可以通过执行以下操作进行安装:

CITOS

1
2
3
4
5
6
7
8
cd /tmp
wget ftp://xmlsoft.org/libxml2/libxml2-2.8.0.tar.gz
tar xzf libxml2-2.8.0.tar.gz
cd libxml2-2.8.0/
./configure
make
sudo make install
cd

乌邦图

sudo apt-get install libxml2-utils

赛文

apt-cyg install libxml2

马科斯

要在带有自制的MacOS上安装此程序,请执行以下操作:brew install libxml2

吉特

如果您需要代码,也可以在Git上找到:git clone git://git.gnome.org/libxml2


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

为此,您将发布如下内容:

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

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


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

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

xmllint支持就地格式化:

1
for f in *.xml; do xmllint -o $f --format $f; done

正如丹尼尔·韦拉德所写:

I think
xmllint -o tst.xml --format tst.xml
should be safe as the parser will fully load the input into a tree
before opening the output to serialize it.

缩进级别由XMLLINT_INDENT环境变量控制,默认为2个空格。示例如何将缩进更改为4个空格:

1
XMLLINT_INDENT='    '  xmllint -o out.xml --format in.xml

当XML文档被破坏时,您可能缺少--recover选项。或者尝试使用带有严格XML输出的弱HTML解析器:

1
xmllint --html --xmlout <in.xml >out.xml

可以使用--nsclean--nonet--nocdata--noblanks等。读人页。

1
2
3
apt-get install libxml2-utils
apt-cyg install libxml2
brew install libxml2