You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让xmllint输出不编码Unicode字符的XML节点内容?

问题

我有一个UTF-8编码的XML文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
  <bar>Hello World äüö</bar>
</foo>

我希望用xmllint提取出如下结果:

<bar>Hello World äüö</bar>

但不管执行哪个xmllint命令,输出里的Unicode字符都会被编码:

$ xmllint --xpath "//bar" file.xml
<bar>Hello World &#xE4;&#xFC;&#xF6;</bar>
$ xmllint --xpath "//bar" --encode utf-8 file.xml
<bar>Hello World &#xE4;&#xFC;&#xF6;</bar>
$ xmllint --xpath "//bar" --noenc file.xml
<bar>Hello World &#xE4;&#xFC;&#xF6;</bar>

我无法安装xmlstarlet等其他工具,请问怎么才能得到未编码的结果?

环境信息

$ xmllint --version
xmllint: using libxml version 20907
   compiled with: Threads Tree Output Push Reader Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy C14N Catalog XPath XPointer XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas Schematron Modules Debug Zlib Lzma
$ locale
LANG=C.utf8
LC_CTYPE="C.utf8"
LC_NUMERIC="C.utf8"
LC_TIME="C.utf8"
LC_COLLATE="C.utf8"
LC_MONETARY="C.utf8"
LC_MESSAGES="C.utf8"
LC_PAPER="C.utf8"
LC_NAME="C.utf8"
LC_ADDRESS="C.utf8"
LC_TELEPHONE="C.utf8"
LC_MEASUREMENT="C.utf8"
LC_IDENTIFICATION="C.utf8"
LC_ALL=
$ cat /etc/*-release
Rocky Linux release 8.8 (Green Obsidian)
解决方法

可以通过以下两种无需额外安装工具的方式实现:

方法1:借助--html选项输出原生字符

xmllint的HTML解析器不会将UTF-8字符转义为实体,搭配系统自带的文本过滤工具即可得到目标内容:

xmllint --html --xpath "//bar" file.xml | grep -v "^<!DOCTYPE" | sed 's/^[[:space:]]*//'

方法2:使用--shell模式提取结果

通过xmllint的交互式shell执行XPath查询,再过滤掉无关输出行:

xmllint --shell file.xml << 'EOF' | sed -n '/<bar>/p'
xpath //bar
EOF

以上两种方法都能直接输出包含原生UTF-8字符的<bar>标签内容,完全依赖系统自带工具即可完成。

内容的提问来源于stack exchange,提问作者han

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:53:12