如何从命令行中漂亮地打印 XML 文件
1. 概述
XML 是一种人类可读的标记语言。但是,如果格式不正确,则不容易阅读或理解。例如,包含单个长行或没有元素缩进的 XML 的 XML 文件很难从视觉上理解。当我们想在 Linux 控制台中显示它时尤其如此。
在本教程中,我们将介绍几种使用 Linux 命令漂亮打印 XML 文件的方法。
2. 我们的 XML 示例
首先,让我们看一下我们将在示例中使用的 XML 文件emails.xml :
<emails> <email> <from>Kai</from> <to>Amanda</to> <time>2018-03-05</time>
<subject>I am flying to you</subject></email> <email>
<from>Jerry</from> <to>Tom</to> <time>1992-08-08</time> <subject>Hey Tom, catch me if you can!</subject>
</email> </emails>
emails.xml文件是有效的 XML 文件。但是,由于它的格式不正确,因此很难阅读和理解。
我们将此文件作为输入示例,并在命令行中漂亮地打印它。
有许多方法可以格式化和输出 XML 文件。在本教程中,我们将介绍三个命令行 XML 实用程序:xmllint 、XMLStarlet 和xml_pp 。
现在,让我们以人类可读的格式打印 emails.xml。
3. 使用 xmllint命令
xmllint命令是*xmllib2 *包的成员。通常,我们可以使用它来检查 XML 文件是否有效、解析 XML 文件或评估XPath 表达式。
3.1. 漂亮的打印 XML
xmllint实用程序具有*–format*选项。使用此选项,我们可以重新格式化和重新缩进 XML。语法很简单:
xmllint --format XML_FILE
让我们使用 xmllint命令重新格式化我们的emails.xml:
$ xmllint --format emails.xml
我们得到输出:
<?xml version="1.0"?>
<emails>
<email>
<from>Kai</from>
<to>Amanda</to>
<time>2018-03-05</time>
<subject>I am flying to you</subject>
</email>
<email>
<from>Jerry</from>
<to>Tom</to>
<time>1992-08-08</time>
<subject>Hey Tom, catch me if you can!</subject>
</email>
</emails>
现在,XML 中的数据更易于阅读和理解。 我们还看到该命令添加了 XML 声明** — 即使我们的输入文件中没有它。
3.2. 格式选项
我们可以使用xmllint命令和*–format选项轻松地重新格式化 XML 文件。**默认缩进为两个空格。但是,我们可以通过设置XMLLINT_INDENT*环境变量来更改它。**
让我们重新格式化并再次打印 emails.xml。这一次,让我们设置四个空格作为缩进:
$ XMLLINT_INDENT=" " ; xmllint --format emails.xml
该命令的输出是:
<?xml version="1.0"?>
<emails>
<email>
<from>Kai</from>
<to>Amanda</to>
<time>2018-03-05</time>
<subject>I am flying to you</subject>
</email>
<email>
...
</email>
</emails>
4. 使用XMLStarlet工具包
XMLStarlet 是一个命令行 XML 工具包。它包含一个名为xml 的可执行文件。使用此命令,我们可以转换、查询、验证和编辑 XML 文档和文件。
我们来看看使用xml命令的语法:
xml [<options>] <command> [<cmd-options>]
4.1.漂亮的打印 XML
我们可以使用 format命令(或简称fo)重新格式化 XML 文件:
$ xml format emails.xml
它输出:
<?xml version="1.0"?>
<emails>
<email>
<from>Kai</from>
<to>Amanda</to>
<time>2018-03-05</time>
<subject>I am flying to you</subject>
</email>
<email>
<from>Jerry</from>
<to>Tom</to>
<time>1992-08-08</time>
<subject>Hey Tom, catch me if you can!</subject>
</email>
</emails>
如上面的输出所示,我们的 emails.xml打印得很漂亮。与xmllint命令相同,默认缩进为两个空格字符。 与xmllint类似,如果输入中缺少 XML 声明,我们还可以看到该命令添加 XML 声明。
接下来,我们来看看xml命令提供了哪些格式选项。
4.2. 格式选项
xml 格式命令有 四个选项来控制输出:
- -n或*–noindent*:不缩进输出
- -t或*–indent-tab*:使用 TAB 缩进输出
- -s或*–indent-spaces *:使用 个空格缩进输出
- –o或*–omit-decl* : 省略 xml 声明**
让我们再次使用我们的emails.xml文件启动**xml 格式命令 ,这一次,我们希望将输出缩进 8 个空格并省略 XML 声明:
$ xml fo -o -s 8 emails.xml
它输出:
<emails>
<email>
<from>Kai</from>
<to>Amanda</to>
<time>2018-03-05</time>
<subject>I am flying to you</subject>
</email>
<email>
...
</email>
</emails>
5. 使用xml_pp命令
xml_pp 命令随Perl 模块*XML::Twig 一起提供。名称xml_pp*代表“XML Pretty-Printer”。
5.1.漂亮的打印 XML
顾名思义,xml_pp是为以漂亮的格式打印 XML 文档而生的。使用它的语法很简单:
xml_pp [options] XML_FILES
让我们看看它是否可以漂亮地打印我们的emails.xml:
$ xml_pp emails.xml
命令打印:
<emails>
<email>
<from>Kai</from>
<to>Amanda</to>
<time>2018-03-05</time>
<subject>I am flying to you</subject>
</email>
<email>
<from>Jerry</from>
<to>Tom</to>
<time>1992-08-08</time>
<subject>Hey Tom, catch me if you can!</subject>
</email>
</emails>
输出显示缩进也是两个空格字符。
此外,如果我们查看输出的开头,如果我们的输入没有 .xml 声明,则默认情况下不会添加 XML 声明。
5.2. 输出选项
我们不能像使用xml 格式和xmllint命令那样设置缩进。此外,xml_pp命令没有为用户提供更改缩进的选项。
xml_pp实用程序支持在其他方面控制输出的选项,例如:
- -e : 设置输出编码
- -p :保留元素中的空格
- -s : 控制输出样式