如何使用xmlstarlet提取//msg节点的属性与子元素为key=value格式
命令调整逻辑
现有命令无法提取属性的核心原因是XPath匹配范围仅限定了//msg/*(即
分场景实现命令
仅提取//msg节点的所有属性为key=value格式
xmlstarlet sel -T -t -m "//msg/@*" -v "concat(name(),'=',.)" -n file
执行后输出与目标效果完全一致:
date=2020-03-21 time=2021-04-27T11:33:27Z type=UNKNOWN level=16 host_id=localhost host_addr=127.0.0.1 pid=6322
核心参数说明:
-m "//msg/@*":匹配所有节点下的全部属性节点 -v "concat(name(),'=',.)":对每个匹配节点,拼接节点名、等号、节点自身的值-n:每完成一行输出就追加换行符
同时提取//msg的所有属性、以及直接子元素文本为key=value格式
xmlstarlet sel -T -t -m "//msg/@* | //msg/*" -v "concat(name(),'=',string(.))" -n file
执行后输出与目标效果完全一致:
date=2020-03-21 time=2021-04-27T11:33:27Z type=UNKNOWN level=16 host_id=localhost host_addr=127.0.0.1 pid=6322 txt=service_update * orclcdb = 0
核心参数说明:
- 用XPath的
|取并集,同时覆盖的所有属性、 的直接子元素两类节点 - 用
string(.)获取子元素的完整文本内容,避免子元素存在嵌套结构时取值不全 - 遍历顺序严格遵循XML文档书写顺序:先按
标签上属性的出现顺序输出所有属性键值,再按子元素的书写顺序输出子元素键值,与Nokogiri脚本的输出顺序完全对齐。
内容的提问来源于stack exchange,提问作者dawg
相关产品推荐
相关产品推荐

