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

使用Ansible解析XML中指定name对应的value值失败,求解决方法

如何用Ansible从带命名空间的XML中提取指定属性值

问题背景

现有如下带默认命名空间的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<Activity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://example.com/2005/06/StandardHeader/" xmlns="http://example.com/xsd/frm/v1/Activity/ManageInternalCustomerChangeRequest">
  <ActivityDetails>
    <activityId>basdsds5-21aa-4ec4-b453-5f08af0fc612</activityId>
    <activityType>ServiceIdRecordUpdate</activityType>
    <activityStartDate>%DateTime%</activityStartDate>
    <listOfActivityAttribute>
      <activityAttribute>
        <name>CustomerId</name>
        <value>%CustomerId%</value>
      </activityAttribute>
      <activityAttribute>
        <name>AssetInstanceId</name>
        <value>%AssetInstanceId%</value>
      </activityAttribute>
      <activityAttribute>
        <name>ServiceId</name>
        <value>%ServiceId%</value>
      </activityAttribute>
      <activityAttribute>
        <name>SupplierServiceId</name>
        <value>%SupplierServiceId%</value>
      </activityAttribute>
    </listOfActivityAttribute>
  </ActivityDetails>
</Activity>

已成功用以下Ansible任务提取activityId的值:

- name: Step-3:Read an element's attribute values
  xml:      
    path: /tmp/test.xml
    xpath: /x:Activity/x:ActivityDetails/x:activityId
    content: text
    namespaces:
      x: "http://example.com/xsd/frm/v1/Activity/ManageInternalCustomerChangeRequest"
  register: xmlresp

但尝试提取CustomerId对应的value值时失败,错误提示:

FAILED! => {"changed": false, "msg": "Xpath /x:Activity/x:ActivityDetails/x:listOfActivityAttribute/x:activityAttribute[name='CustomerId'] does not reference a node!"}

解决方案

问题核心是XPath条件中的name节点未添加命名空间前缀——XML的默认命名空间会作用于所有未指定前缀的子节点,因此name也属于x命名空间。

正确的Ansible任务如下:

- name: Step-4:Read Customer ID from XML
  xml:
    path: /tmp/test.xml
    xpath: /x:Activity/x:ActivityDetails/x:listOfActivityAttribute/x:activityAttribute[x:name='CustomerId']/x:value
    content: text
    namespaces:
      x: "http://example.com/xsd/frm/v1/Activity/ManageInternalCustomerChangeRequest"
  register: xmlresp1

结果说明

执行上述任务后,xmlresp1.ansible_facts.Value即为所需的%CustomerId%值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:12:07