如何在Linux命令行下处理XML xmllint工具用法

xmllint 是 libxml2 提供的轻量高效命令行 XML 工具,支持格式化、DTD/XSD 校验、XPath 提取及结合 shell 实现简单编辑,无需 Python/Java 环境,多数 Linux 预装或易安装。

xmllint 是 libxml2 提供的命令行 XML 处理工具,轻量、高效,适合脚本中解析、校验、格式化或提取 XML 内容。它不依赖 Python 或 Java 环境,开箱即用(多数 Linux 发行版预装或可通过 apt install libxml2-utils / yum install libxml2 安装)。

格式化(美化)XML 输出

让压缩或混乱的 XML 变得可读:

  • 基本格式化:xmllint --format input.xml
  • 保存到新文件:xmllint --format input.xml > pretty.xml
  • 原地格式化(需 GNU sed 配合,xmllint 本身不支持 -i):xmllint --format input.xml > tmp && mv tmp input.xml

验证 XML 是否符合 DTD 或 XSD

检查语法和结构合法性:

  • 用内置 DTD 验证(如 XHTML):xmllint --valid --noout file.xhtml
  • 用外部 XSD 验证:xmllint --schema schema.xsd data.xml --noout
  • --noout 表示只输出错误,不打印文档内容;省略则会先输出校验后的 XML

提取节点内容(XPath 查询)

--xpath 提取文本或节点,类似“XML 的 grep”:

  • 提取所有 title 文本:xmllint --xpath '//title/text()' book.xml
  • 提取带属性的节点:xmllint --xpath '//*[@id="main"]/name/text()' config.xml
  • 提取整个节点(含标签):xmllint --xpath '//config' config.xml(去掉 /text()
  • 注意:XPath 必须写完整,// 表示任意层级,. 表示当前节点,@attr 获取属性值

编辑与转换(配合 shell 工具)

xmllint 本身不修改文件,但可组合实现简单编辑:

  • 替换某个值(如把 version=1.0 改成 2.0):xmllint --shell input.xml (较繁琐,建议搭配 xmlstarsed 正则处理简单场景)
  • 删除节点:xmllint --xpath '/*[not(self::obsolete)]' input.xml(用 XPath 排除方式间接“删除”)
  • 生成新 XML 片段:echo 'new' | xmllint --format -(- 表示从 stdin 读)

实际使用中,优先用 --xpath 提取、--format 整理、--schema 校验。复杂修改建议转用 xmlstar 或编程语言,xmllint 更擅长“查”和“验”,而非“改”。