xml – Manage bits and pieces of XML files or strings
Note
This module is part of the middleware_automation.common collection.
It is not included in ansible-core
.
To check whether it is installed, run ansible-galaxy collection list
.
To install it, use: ansible-galaxy collection install middleware_automation.common
.
You need further requirements to be able to use this module,
see Requirements for details.
To use it in a playbook, specify: middleware_automation.common.xml
.
Synopsis
A customized version of community.general.xml dedicated to runtimes configuration xpath/xslt.
Requirements
The below requirements are needed on the host that executes this module.
lxml >= 3.0.0
Parameters
Parameter |
Comments |
---|---|
Add additional child-element(s) to a selected element for a given xpath. Child elements must be given in a list and each item may be either a string (eg. This parameter requires xpath to be set. |
|
The attribute to select when using parameter value. This is a string, not prepended with |
|
Create a backup file including the timestamp information so you can get the original file back if you somehow clobbered it incorrectly. Choices:
|
|
Search for a given xpath and get content. This parameter requires xpath to be set. Choices:
|
|
Search for a given xpath and provide the count of any matches. This parameter requires xpath to be set. Choices:
|
|
Type of input for add_children and set_children. Choices:
|
|
Add additional child-element(s) after the last selected element for a given xpath. Child elements must be given in a list and each item may be either a string (eg. This parameter requires xpath to be set. Choices:
|
|
Add additional child-element(s) before the first selected element for a given xpath. Child elements must be given in a list and each item may be either a string (eg. This parameter requires xpath to be set. Choices:
|
|
The namespace Needs to be a Default: |
|
Path to the file to operate on. This file must exist ahead of time. This parameter is required, unless xmlstring is given. |
|
Pretty print XML output. Choices:
|
|
Search for a given xpath and print out any matches. This parameter requires xpath to be set. Choices:
|
|
Set the child-element(s) of a selected element for a given xpath. Removes any existing children. Child elements must be specified as in add_children. This parameter requires xpath to be set. |
|
Set or remove an xpath selection (node(s), attribute(s)). Choices:
|
|
Remove CDATA tags surrounding text values. Note that this might break your XML file if text values contain characters that could be interpreted as XML. Choices:
|
|
Perform schema validation of the XML input. This parameter requires xsd_path to be set. Choices:
|
|
Desired state of the selected attribute. Either a string, or to unset a value, the Python Elements default to no value (but present). Attributes default to an empty string. |
|
A string containing XML on which to operate. This parameter is required, unless path is given. |
|
A valid XPath expression describing the item(s) you want to manipulate. Operates on the document root, |
|
Path to the xsd schema file to perform xml validation This file must exist ahead of time. This parameter is required when validate is true. |
Notes
Note
Use the
--check
and--diff
options when testing your expressions.The diff output is automatically pretty-printed, so may not reflect the actual file content, only the file structure.
This module does not handle complicated xpath expressions, so limit xpath selectors to simple expressions.
Beware that in case your XML elements are namespaced, you need to use the namespaces parameter, see the examples.
Namespaces prefix should be used for all children of an element where namespace is defined, unless another namespace is defined for them.
See Also
See also
- Introduction to XPath
A brief tutorial on XPath (w3schools.com).
- XPath Reference document
The reference documentation on XSLT/XPath (developer.mozilla.org).
Examples
# Consider the following XML file:
#
# <business type="bar">
# <name>Tasty Beverage Co.</name>
# <beers>
# <beer>Rochefort 10</beer>
# <beer>St. Bernardus Abbot 12</beer>
# <beer>Schlitz</beer>
# </beers>
# <rating subjective="true">10</rating>
# <website>
# <mobilefriendly/>
# <address>http://tastybeverageco.com</address>
# </website>
# </business>
- name: Remove the 'subjective' attribute of the 'rating' element
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: /business/rating/@subjective
state: absent
- name: Set the rating to '11'
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: /business/rating
value: 11
# Retrieve and display the number of nodes
- name: Get count of 'beers' nodes
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: /business/beers/beer
count: true
register: hits
- ansible.builtin.debug:
var: hits.count
# Example where parent XML nodes are created automatically
- name: Add a 'phonenumber' element to the 'business' element
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: /business/phonenumber
value: 555-555-1234
- name: Add several more beers to the 'beers' element
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: /business/beers
add_children:
- beer: Old Rasputin
- beer: Old Motor Oil
- beer: Old Curmudgeon
- name: Add several more beers to the 'beers' element and add them before the 'Rochefort 10' element
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: '/business/beers/beer[text()="Rochefort 10"]'
insertbefore: true
add_children:
- beer: Old Rasputin
- beer: Old Motor Oil
- beer: Old Curmudgeon
# NOTE: The 'state' defaults to 'present' and 'value' defaults to 'null' for elements
- name: Add a 'validxhtml' element to the 'website' element
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: /business/website/validxhtml
- name: Add an empty 'validatedon' attribute to the 'validxhtml' element
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: /business/website/validxhtml/@validatedon
- name: Add or modify an attribute, add element if needed
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: /business/website/validxhtml
attribute: validatedon
value: 1976-08-05
# How to read an attribute value and access it in Ansible
- name: Read an element's attribute values
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: /business/website/validxhtml
content: attribute
register: xmlresp
- name: Show an attribute value
ansible.builtin.debug:
var: xmlresp.matches[0].validxhtml.validatedon
- name: Remove all children from the 'website' element (option 1)
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: /business/website/*
state: absent
- name: Remove all children from the 'website' element (option 2)
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: /business/website
set_children: []
# In case of namespaces, like in below XML, they have to be explicitly stated.
#
# <foo xmlns="http://x.test" xmlns:attr="http://z.test">
# <bar>
# <baz xmlns="http://y.test" attr:my_namespaced_attribute="true" />
# </bar>
# </foo>
# NOTE: There is the prefix 'x' in front of the 'bar' element, too.
- name: Set namespaced '/x:foo/x:bar/y:baz/@z:my_namespaced_attribute' to 'false'
middleware_automation.common.xml:
path: foo.xml
xpath: /x:foo/x:bar/y:baz
namespaces:
x: http://x.test
y: http://y.test
z: http://z.test
attribute: z:my_namespaced_attribute
value: 'false'
- name: Adding building nodes with floor subnodes from a YAML variable
middleware_automation.common.xml:
path: /foo/bar.xml
xpath: /business
add_children:
- building:
# Attributes
name: Scumm bar
location: Monkey island
# Subnodes
_:
- floor: Pirate hall
- floor: Grog storage
- construction_date: "1990" # Only strings are valid
- building: Grog factory
# Consider this XML for following example -
#
# <config>
# <element name="test1">
# <text>part to remove</text>
# </element>
# <element name="test2">
# <text>part to keep</text>
# </element>
# </config>
- name: Delete element node based upon attribute
middleware_automation.common.xml:
path: bar.xml
xpath: /config/element[@name='test1']
state: absent
Return Values
Common return values are documented here, the following are the fields unique to this module:
Key |
Description |
---|---|
A dictionary with the original xpath, namespaces and state. Returned: success Sample: |
|
The name of the backup file that was created Returned: when backup=true Sample: |
|
The count of xpath matches. Returned: when parameter 'count' is set Sample: |
|
The xpath matches found. Returned: when parameter 'print_match' is set |
|
A message related to the performed action(s). Returned: always |
|
An XML string of the resulting output. Returned: when parameter 'xmlstring' is set |