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

如何用yq解析XML并无需指定索引提取服务器名称

无需指定索引提取XML中的服务器名称(yq及其他工具方案)

问题场景

我需要解析Oracle WebLogic的config.xml文件提取所有服务器名称,但当前使用yq时必须指定每个服务器的索引才能获取对应名称,希望找到无需指定索引即可批量提取的方法。

当前执行的命令及输出:

cat /home/hakim/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/original/config.xml | yq -p=xml .domain.server

输出结果:

- name: AdminServer
  ssl:
    name: AdminServer
    listen-port: "7002"
  listen-address:
- name: Server_1
  machine: Machine_1
  listen-port: "7003"
  cluster: Cluster_1
  listen-address:
  jta-migratable-target:
    user-preferred-server: Server_1
    cluster: Cluster_1
- name: Server_2
  machine: Machine_1
  listen-port: "7004"
  cluster: Cluster_1
  listen-address:
  jta-migratable-target:
    user-preferred-server: Server_2
    cluster: Cluster_1
- name: Server_3
  machine: Machine_1
  listen-port: "7005"
  cluster: Cluster_1
  listen-address:
  jta-migratable-target:
    user-preferred-server: Server_3
    cluster: Cluster_1

解决方案

1. 使用yq批量提取所有服务器名称

利用yq的数组遍历语法[],直接遍历所有server元素并提取name字段,无需指定索引:

yq -p=xml '.domain.server[].name' /home/hakim/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/original/config.xml

输出示例:

AdminServer
Server_1
Server_2
Server_3

如果需要输出纯字符串(不带引号),添加-r参数:

yq -r -p=xml '.domain.server[].name' /home/hakim/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/original/config.xml

2. 使用xmllint(原生XML处理工具)

如果系统预装了xmllint,可以直接用XPath查询原生XML,无需转成YAML格式:

xmllint --xpath '//domain/server/name/text()' /home/hakim/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/original/config.xml

若需要换行分隔每个名称,可搭配grep处理:

xmllint --format --xpath '//domain/server/name' /home/hakim/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/original/config.xml | grep -oP '(?<=<name>).*(?=</name>)'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:01:30