xmllint 是一个强大的命令行工具,它是 Libxml2 库的一部分,这个库是许多 XML 处理应用程序(包括 PHP 的 XML 扩展)的核心。xmllint 主要用于命令行下对 XML 文件进行验证、解析、转换和调试。

核心功能与常用场景
-
XML 验证:
- 检查 XML 文件是否符合 XML 1.0 规范(格式是否正确)。
- 检查 XML 文件是否符合一个指定的 DTD(文档类型定义)或 XSD(XML Schema Definition)模式。
-
格式化/美化输出:
将没有良好格式的 XML 文件(所有内容都在一行)转换成缩进清晰、易于阅读的格式。
-
XPath 查询:
(图片来源网络,侵删)- 这是
xmllint一个非常强大的功能,它允许你使用 XPath 表达式来查询和提取 XML 文件中的特定节点、属性或文本内容。
- 这是
-
错误诊断:
- 当 XML 文件有语法错误时,
xmllint会给出详细的错误信息,包括出错行号和原因,是调试 XML 文件的利器。
- 当 XML 文件有语法错误时,
-
转换:
结合 XSLT (Extensible Stylesheet Language Transformations),可以将 XML 文件转换成其他格式,如 HTML、纯文本或另一种 XML 格式。
安装
xmllint 通常包含在 libxml2-utils 这个软件包中。

-
Debian / Ubuntu / Mint:
sudo apt-get update sudo apt-get install libxml2-utils
-
RHEL / CentOS / Fedora:
sudo yum install libxml2 # 或者使用 dnf (新版本) sudo dnf install libxml2
-
macOS (使用 Homebrew):
brew install libxml2
安装完成后,可以通过以下命令检查版本:
xmllint --version
常用命令选项详解
下面是 xmllint 最常用的一些选项,我会结合示例来解释。
基础验证与格式化
--noout
作用:不输出结果,这个选项通常用于验证,因为我们只关心文件是否有效,而不需要看到解析后的内容。
示例:检查一个 XML 文件的语法是否正确。
xmllint --noout myfile.xml
- 如果文件有效,命令会静默执行,没有输出。
- 如果文件有错误,会打印出错误信息。
--format (或 -format)
作用:格式化 XML 输出,添加缩进和换行,使其更易读。
示例:格式化一个未格式化的 XML 文件。
# 原始文件 content.xml 内容可能是一整行:<root><item>foo</item><item>bar</item></root> xmllint --format content.xml
输出:
<root> <item>foo</item> <item>bar</item> </root>
你可以将格式化后的结果重定向到一个新文件:
xmllint --format content.xml > formatted_content.xml
DTD 与 Schema 验证
--dtdvalid <dtd_file>
作用:根据指定的 DTD 文件来验证 XML 文件。
示例:
假设我们有一个 DTD 文件 document.dtd 和一个 XML 文件 report.xml。
xmllint --dtdvalid document.dtd report.xml
report.xml符合document.dtd的定义,命令成功。- 如果不符合,会报告验证错误(缺少某个元素、属性值不合法等)。
--schema <xsd_file>
作用:根据指定的 XSD 文件来验证 XML 文件,XSD 是比 DTD 更现代、更强大的模式定义语言。
示例:
xmllint --schema my_schema.xsd data_to_validate.xml
这个命令会检查 data_to_validate.xml 是否符合 my_schema.xsd 的定义。
XPath 查询
这是 xmllint 最强大的功能之一,使用 --xpath 选项。
示例 XML 文件 (library.xml):
<library>
<book category="FICTION">lang="en">The Great Gatsby</title>
<author>F. Scott Fitzgerald</author>
<year>1925</year>
</book>
<book category="SCIENCE">lang="en">A Brief History of Time</title>
<author>Stephen Hawking</author>
<year>1988</year>
</book>
</library>
查询所有 <title> 节点
xmllint --xpath "//title" library.xml
输出:
查询所有书的作者
xmllint --xpath "//book/author/text()" library.xml
输出:
F. Scott Fitzgerald
Stephen Hawking
//book/author选择所有book下的author节点。/text()提取这些节点的文本内容。- 如果不加
/text(),会输出完整的<author>...</author>
查询第一本书的标题
xmllint --xpath "/library/book[1]/title/text()" library.xml
输出:
The Great Gatsby
[1]表示选择第一个匹配的book节点(XPath 索引从 1 开始)。
查询类别为 "FICTION" 的书的标题
xmllint --xpath "//book[@category='FICTION']/title/text()" library.xml
输出:
The Great Gatsby
[@category='FICTION']是一个谓词,用于筛选category属性值为 "FICTION" 的book节点。
获取某个节点的属性
xmllint --xpath "//book[1]/@category" library.xml
输出:
category="FICTION"
XSLT 转换
--html (或 --xml)
作用:指定输入文件的类型。--html 会以更宽松的 HTML 方式解析,--xml 则是严格的 XML 解析。
--stylesheet <xsl_file>
作用:使用指定的 XSLT 文件对 XML 文件进行转换。
示例:
假设我们有一个 XSLT 文件 to_html.xsl,它可以将 library.xml 转换成 HTML,我们可以这样运行:
xmllint --stylesheet to_html.xsl library.xml
这个命令会读取 library.xml 并应用 to_html.xsl 的转换规则,然后将生成的 HTML 输出到终端,你可以将其重定向到一个 .html 文件。
实用技巧与综合示例
场景:快速定位 XML 中的语法错误
如果你的 XML 文件非常大,用文本编辑器很难找到错误,xmllint 可以帮你。
# 假设 broken.xml 有一个未闭合的标签 xmllint --noout broken.xml
可能的错误输出:
broken.xml:4: parser error : Opening and closing tag mismatch: line 3
</author>
^
broken.xml:5: parser error : Extra content at the end of the document
</library>
它明确告诉你第 4 行有问题,并且指出了是 </author> 和 </library> 标签不匹配。
场景:从配置文件中提取一个值
假设你有一个 config.xml 文件:
<config>
<database>
<host>localhost</host>
<port>5432</port>
<user>admin</user>
</database>
<logging>
<level>INFO</level>
</logging>
</config>
你想提取数据库的端口号:
DB_PORT=$(xmllint --xpath "string(/config/database/port/text())" config.xml) echo "The database port is: $DB_PORT"
输出:
The database port is: 5432
这里我们使用了 string() XPath 函数,它会将查询结果直接转换为字符串,非常适合在脚本中获取单个值。
| 功能 | 常用命令 | 描述 |
|---|---|---|
| 语法检查 | xmllint --noout file.xml |
检查 XML 是否符合基本语法规范。 |
| 格式化 | xmllint --format file.xml |
美化 XML 文件,使其易于阅读。 |
| DTD 验证 | xmllint --dtdvalid.dtd file.xml |
使用 DTD 文件验证 XML。 |
| XSD 验证 | xmllint --schema.xsd file.xml |
使用 XSD 文件验证 XML。 |
| XPath 查询 | xmllint --xpath "//node" file.xml |
使用 XPath 表达式提取数据。 |
| XSLT 转换 | xmllint --stylesheet.xsl file.xml |
使用 XSLT 样式表转换 XML。 |
xmllint 是每个开发者和系统管理员都应该掌握的命令行工具,尤其是在处理基于 XML 的配置、日志和 Web 服务数据时,它的高效和直接性是图形界面工具无法比拟的。
