如何在Bash脚本中解析XML文件?


XML代表可扩展标记语言 (Extensible Markup Language)。它是一种广泛使用的格式,用于在系统之间交换数据。许多应用程序都使用XML作为其配置文件。甚至众所周知的文档应用程序Office也基于XML。

  • XML之所以如此受欢迎,是因为它使用纯文本编写,易于使用且独立于平台。它可以在任何编程语言中使用。
  • 与HTML和其他标记语言不同,XML没有预定义的标签需要记住和使用。使用XML,您可以根据需要选择标签来表示您正在处理的内容,并通过树状结构进行组织。

在Linux中,有很多工具和程序允许我们解析和读取XML文件的内容。在本文中,我们将看到一些处理XML文件的示例。

为什么解析XML文件?

解析或读取XML文件有助于我们了解其内容和结构。此操作通过两种方式帮助我们:首先,通过搜索特定元素;其次,通过提取信息。

使用XMLStarlet解析XML文件

为了读取/解析XML文件,我们需要一个专门的工具。在Linux中,有很多工具可以完成这项工作。其中之一是XMLStarlet。它是一个命令行实用程序,可以帮助读取XML文件,并具有选择、验证和编辑XML文件等多种功能。

在Linux中安装XMLStarlet

XMLStarlet并非Linux自带。您需要先安装它。由于它在Ubuntu、Fedora和Arch的软件仓库中可用,因此您只需使用包管理器即可轻松安装。

对于Debian / Ubuntu / Mint

sudo apt install xmlstarlet

对于RedHat / Fedora

sudo dnf check-update

要检查安装是否成功,请使用选项--version打印工具的当前版本:

xmlstarlet -v

这应该会输出系统中安装的版本:

1.6.1

XMLStarlet的基本用法

如前所述,XMLStarlet是一个功能强大的工具,在处理XML格式文档时,我们可以使用它的许多功能。

例如,假设我们有一个名为example.xml的XML文件需要解析。

选择特定元素

我们创建的示例文件用于演示XMLStarlet的用法如下:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
   <book category="fiction">
      <title lang="en">Learn BashScript</title>
      <author>TutorialsPoint</author>
      <year>1925</year>
      <price>10.99</price>
   </book>

   <book category="non-fiction">
      <title lang="en">Learn Docker</title>
      <author>TutorialsPoint</author>
      <year>2011</year>
      <price>14.99</price>
   </book>

   <book category="children">
      <title lang="en">Guide to Linux</title>
      <author>TutorialsPoint</author>
      <year>2023</year>
      <price>7.99</price>
   </book>
</bookstore>

在这个例子中,XML文件格式很好。如果您有一个格式不正确的文件,可以使用该工具的`fo`选项以美观的方式打印文档:

xmlstarlet fo example.xml


使用该工具,我们可以获取特定元素,例如:

xmlstarlet sel -t -v "//author" example.xml

让我们了解一下我们在这里使用的选项:

  • sel代表“select”(选择),允许我们从文件中选择一个元素。
  • -t代表“template”(模板),它告诉工具我们需要如何输出元素。
  • -v告诉工具我们需要元素的值。在这个例子中,元素是author。
  • //表示我们需要文件中所有这样的元素。
  • author是我们正在搜索的元素的名称。

选项example.xml是我们需要解析的XML文件的名称。

因为在我们的示例中,author元素重复了三次,所以输出应该是:

TutorialsPoint
TutorialsPoint
TutorialsPoint

编辑XML文件

使用该工具还可以帮助我们将元素添加到现有的XML文件中,例如:

xmlstarlet ed -L -s "//bookstore" -t elem -n "course" -v "" \
   -s "//course[last()]" -t elem -n "title" -v "Operating Systems" \
   example.xml

让我们解释一下我们在这里使用的选项:

  • ed - 告诉XMLStarlet我们需要编辑一个文件。
  • -L - 这意味着我们需要修改并保存文件。
  • //bookstore - 选择我们要添加子元素的元素(我们需要在bookstore元素下)。
  • -t elem - 这意味着我们要创建一个元素。
  • -v - 设置值。
  • -s "//course[last()]" - 这将选择我们刚刚添加的最后一个“course”元素。
  • -n "title" - 在我们刚刚创建的“course”元素下添加一个新的元素。
  • -v "Operating Systems" - 设置title元素的值。

如果我们运行此命令,它应该添加一个名为course的新元素,其中包含一个名为title的子元素,其值为“Operating Systems”。

现在,如果您再次打开该文件,您将看到我们添加到文件中的新的course元素:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
   <book category="fiction">
      <title lang="en">Learn BashScript</title>
      <author>TutorialsPoint</author>
      <year>1925</year>
      <price>10.99</price>
   </book>
   
   <book category="non-fiction">
      <title lang="en">Learn Docker</title>
      <author>TutorialsPoint</author>
      <year>2011</year>
      <price>14.99</price>
   </book>
   <book category="children">
      <title lang="en">Guide to Linux</title>
      <author>TutorialsPoint</author>
      <year>2023</year>
      <price>7.99</price>
   </book>
   <course>
      <title>Operating Systems</title>
   </course>
</bookstore>

您应该注意,我们在bookstore元素下有一个名为course的新元素。XML是树状的,因此course是bookstore元素的子元素,title是course元素的子元素。

模式验证

使用XMLStarlet,我们可以使用以下命令来验证针对DTD或模式的XML文件(example.xml):

xmlstarlet val -d schema.dtd example.xml

DTD(文档类型定义)定义了XML文件的结构和规则。此验证检查文件是否遵循DTD中定义的指定规则或结构。

在这个例子中,我们将模式设置为schema.dtd,我们想检查文档example.xml是否符合它。

结论

在本教程中,我们演示了如何使用XMLStarlet工具在bash脚本中解析XML文件,如果我们需要解析和编辑XML文件,这将对我们有所帮助。在本文中,我们举例说明了如何选择元素和编辑以向文件中添加新字段。

更新于:2024年11月4日

61 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告