如何从SOAP响应解析XPath提取键值对并保存为CSV
从SOAP响应提取指定元素生成CSV的解决方案
你的核心问题是要排除嵌套在environment、folder节点内的同名元素,精准提取ns:return直接子节点的ax2159:id和ax2159:name,以下是两种工具的实现方案:
方法一:使用xmllint
通过精准XPath过滤命名空间和节点层级,再用awk将提取的id和name配对成CSV:
# 提取目标id和name并生成CSV xmllint --xpath "//*[local-name()='getAllUserApplicationsResponse']/*[local-name()='return']/*[local-name()='id' and namespace-uri()='http://types.core.api.admin.abc.example.com/xsd']/text() | //*[local-name()='getAllUserApplicationsResponse']/*[local-name()='return']/*[local-name()='name' and namespace-uri()='http://types.core.api.admin.abc.example.com/xsd']/text()" request.xml | awk 'NR%2==1{id=$0} NR%2==0{print id","$0}' > output.csv
关键说明:
namespace-uri()确保只匹配ax2159前缀对应的元素(其命名空间为http://types.core.api.admin.abc.example.com/xsd)- awk将奇数行的id与偶数行的name配对,输出标准CSV格式
方法二:使用xmlstarlet(更简洁高效)
xmlstarlet支持直接绑定命名空间并遍历节点生成CSV,无需额外处理工具:
xmlstarlet sel -N ns="http://application.app.api.admin.abc.example.com" -N ax2159="http://types.core.api.admin.abc.example.com/xsd" -t -m "//ns:getAllUserApplicationsResponse/ns:return" -v "ax2159:id" -o "," -v "ax2159:name" -n request.xml > output.csv
关键说明:
-N:绑定SOAP响应中的命名空间前缀,避免模糊匹配-m:遍历每个ns:return节点-v:提取指定元素的文本内容,-o ","添加分隔符,-n换行分隔每条记录
生成的CSV内容示例:
396112,com.example.app.name
内容的提问来源于stack exchange,提问作者Ranjeet
相关产品推荐
相关产品推荐

