如何在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文件,这将对我们有所帮助。在本文中,我们举例说明了如何选择元素和编辑以向文件中添加新字段。