Contents

如何从命令行中漂亮地打印 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 : 控制输出样式