The parse_xml filter plugin.
Version added: 1.0.0
- This filter will load the spec file and pass the command output through it, returning JSON output.
- The YAML spec file defines how to parse the CLI output.
- This plugin is deprecated and will be removed in a future release after 2027-02-01, please Use ansible.utils.cli_parse instead.
Note
- To convert the XML output of a network device command into structured JSON output.
# Using parse_xml
# example_output.xml
# <?xml version="1.0" encoding="UTF-8"?>
# <rpc-reply message-id="urn:uuid:0cadb4e8-5bba-47f4-986e-72906227007f">
# <data>
# <ntp>
# <nodes>
# <node>
# <node>0/0/CPU0</node>
# <associations>
# <is-ntp-enabled>true</is-ntp-enabled>
# <sys-leap>ntp-leap-no-warning</sys-leap>
# <peer-summary-info>
# <peer-info-common>
# <host-mode>ntp-mode-client</host-mode>
# <is-configured>true</is-configured>
# <address>10.1.1.1</address>
# <reachability>0</reachability>
# </peer-info-common>
# <time-since>-1</time-since>
# </peer-summary-info>
# <peer-summary-info>
# <peer-info-common>
# <host-mode>ntp-mode-client</host-mode>
# <is-configured>true</is-configured>
# <address>172.16.252.29</address>
# <reachability>255</reachability>
# </peer-info-common>
# <time-since>991</time-since>
# </peer-summary-info>
# </associations>
# </node>
# </nodes>
# </ntp>
# </data>
# </rpc-reply>
# parse_xml.yml
# ---
# vars:
# ntp_peers:
# address: "{{ item.address }}"
# reachability: "{{ item.reachability}}"
# keys:
# result:
# value: "{{ ntp_peers }}"
# top: data/ntp/nodes/node/associations
# items:
# address: peer-summary-info/peer-info-common/address
# reachability: peer-summary-info/peer-info-common/reachability
- name: Facts setup
ansible.builtin.set_fact:
xml: "{{ lookup('file', 'example_output.xml') }}"
- name: Parse xml invocation
ansible.builtin.debug:
msg: "{{ xml | ansible.netcommon.parse_xml('parse_xml.yml') }}"
# Task Output
# -----------
#
# TASK [set xml Data]
# ok: [host] => changed=false
# ansible_facts:
# xml: |-
# <?xml version="1.0" encoding="UTF-8"?>
# <rpc-reply message-id="urn:uuid:0cadb4e8-5bba-47f4-986e-72906227007f">
# <data>
# <ntp>
# <nodes>
# <node>
# <node>0/0/CPU0</node>
# <associations>
# <is-ntp-enabled>true</is-ntp-enabled>
# <sys-leap>ntp-leap-no-warning</sys-leap>
# <peer-summary-info>
# <peer-info-common>
# <host-mode>ntp-mode-client</host-mode>
# <is-configured>true</is-configured>
# <address>10.1.1.1</address>
# <reachability>0</reachability>
# </peer-info-common>
# <time-since>-1</time-since>
# </peer-summary-info>
# <peer-summary-info>
# <peer-info-common>
# <host-mode>ntp-mode-client</host-mode>
# <is-configured>true</is-configured>
# <address>172.16.252.29</address>
# <reachability>255</reachability>
# </peer-info-common>
# <time-since>991</time-since>
# </peer-summary-info>
# </associations>
# </node>
# </nodes>
# </ntp>
# </data>
# </rpc-reply>
# TASK [Parse Data]
# ok: [host] => changed=false
# ansible_facts:
# output:
# result:
# - address:
# - 10.1.1.1
# - 172.16.252.29
# reachability:
# - '0'
# - '255'
- Ganesh Nalawade (@ganeshrn)
Hint
Configuration entries for each entry type have a low to high priority order. For example, a variable that is lower in the list will override a variable that is higher up.