首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取XML并仅提取值

读取XML并仅提取值
EN

Unix & Linux用户
提问于 2020-02-29 18:56:35
回答 2查看 4.3K关注 0票数 0

仅提取XML文件中的值集的最简单方法是什么?例如,XML文件中的数据是

代码语言:javascript
运行
复制

我只想从脚本中显示low

下面是我使用的sed命令,它返回完整的字符串

代码语言:javascript
运行
复制
sed -n '/cipher_strength/{s/.*//;s/<\/cipher_strength.*Value=""//;p;}' test.xml

根据评论,我不能使用xmlstarlet,因为这在我的suse版本中是不可用的,并且被无法安装的供应商锁定。

EN

回答 2

Unix & Linux用户

发布于 2020-03-02 15:42:49

使用命令行XML解析器xmlstarlet

代码语言:javascript
运行
复制
xmlstarlet sel -t -v '//entry[@key="cipher_strength"]/@value' -nl file.xml

这将匹配XML文档中任何位置的所有entry节点,如果同一个entry节点具有一个值为cipher_strengthkey属性,则将提取它们的D5属性的值。每个值都将输出一个尾换行符。

在各种系统上可用的xmllint实现似乎在它们对执行XPath查询的支持上有所不同。

在我的OpenBSD系统上,你可以

代码语言:javascript
运行
复制
xmllint --xpath '//entry[@key="cipher_strength"]/@value' file.xml

回来

代码语言:javascript
运行
复制
 value="low"

但是,我认为xmllint --xpath '//entry[@key="cipher_strength"]/@value/text()' file.xml可能会给出字符串low,但它似乎不起作用(只生成一个XPath set is empty响应)。

只要value属性的值是“很好的”,就应该能够对此输出进行按摩,以提取实际值:

代码语言:javascript
运行
复制
$ xmllint --xpath '//entry[@key="cipher_strength"]/@value' file.xml | sed -e 's/^[^"]*"//' -e 's/"$//'
low

上面的sed表达式删除到第一个双引号字符之前的所有内容,然后从每一行中删除最后一个双引号字符。

其他xmllint实现/版本可能采用使用xmllint --shell的方式:

代码语言:javascript
运行
复制
xmllint --shell file.xml <<<'cat //entry[@key="cipher_strength"]/@value' |
sed -e '/^[^ ]/d' -e 's/^[^"]*"//' -e 's/"$//'
票数 2
EN

Unix & Linux用户

发布于 2020-03-03 08:11:53

如果没有专用的XML工具可用,您可能需要使用awk:调用

代码语言:javascript
运行
复制
user@host~$ awk '/key="cipher_strength"/ {for (i=1;i<=NF;i++) { if (split($i,parts,"=")==2 && parts[1]=="value") print parts[2]}}' file.xml

将查找所有包含key="cipher_strength"的行,然后在=符号处拆分所有空格分隔的字符串。对于所有包含该符号“在中间”(即前面有一部分,后面有一个部分)的人,检查第一部分是否等于value,如果等于,则打印第二个。为了你的意见,我得到了

代码语言:javascript
运行
复制
user@host~$ awk '/key="cipher_strength"/ {for (i=1;i<=NF;i++) { if (split($i,parts,"=")==2 && parts[1]=="value") print parts[2]}}' file.xml
"low"

如果有更多的节点,您可以尝试修改程序,以确保您在应用此操作之前处于正确的位置。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/570431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档