如何让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 äüö</bar> $ xmllint --xpath "//bar" --encode utf-8 file.xml <bar>Hello World äüö</bar> $ xmllint --xpath "//bar" --noenc file.xml <bar>Hello World äüö</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
相关产品推荐
相关产品推荐

