使用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
相关产品推荐
相关产品推荐

