diff --git a/changelogs/fragments/8437-xml-children-value.yml b/changelogs/fragments/8437-xml-children-value.yml new file mode 100644 index 0000000000..1074764871 --- /dev/null +++ b/changelogs/fragments/8437-xml-children-value.yml @@ -0,0 +1,2 @@ +minor_changes: + - xml - support adding value of children when creating with subnodes (https://github.com/ansible-collections/community.general/pull/8437). diff --git a/plugins/modules/xml.py b/plugins/modules/xml.py index 483383b5d3..ef79cdbfbc 100644 --- a/plugins/modules/xml.py +++ b/plugins/modules/xml.py @@ -301,7 +301,9 @@ EXAMPLES = r""" # Attributes name: Scumm bar location: Monkey island -# Subnodes + # Value + +value: unreal + # Subnodes _: - floor: Pirate hall - floor: Grog storage @@ -756,6 +758,7 @@ def child_to_element(module, child, in_type): (key, value) = next(iteritems(child)) if isinstance(value, MutableMapping): children = value.pop('_', None) + child_value = value.pop('+value', None) node = etree.Element(key, value) @@ -765,6 +768,9 @@ def child_to_element(module, child, in_type): subnodes = children_to_nodes(module, children) node.extend(subnodes) + + if child_value is not None: + node.text = child_value else: node = etree.Element(key) node.text = value diff --git a/tests/integration/targets/xml/results/test-set-children-elements-value.xml b/tests/integration/targets/xml/results/test-set-children-elements-value.xml new file mode 100644 index 0000000000..53e23c80d6 --- /dev/null +++ b/tests/integration/targets/xml/results/test-set-children-elements-value.xml @@ -0,0 +1,11 @@ + + + Tasty Beverage Co. + + 25 + 10 + + +
http://tastybeverageco.com
+
+
diff --git a/tests/integration/targets/xml/results/test-set-children-elements-value.xml.license b/tests/integration/targets/xml/results/test-set-children-elements-value.xml.license new file mode 100644 index 0000000000..edff8c7685 --- /dev/null +++ b/tests/integration/targets/xml/results/test-set-children-elements-value.xml.license @@ -0,0 +1,3 @@ +GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +SPDX-License-Identifier: GPL-3.0-or-later +SPDX-FileCopyrightText: Ansible Project diff --git a/tests/integration/targets/xml/tasks/main.yml b/tests/integration/targets/xml/tasks/main.yml index 8235f1a6b6..7bd1e90f67 100644 --- a/tests/integration/targets/xml/tasks/main.yml +++ b/tests/integration/targets/xml/tasks/main.yml @@ -62,6 +62,7 @@ - include_tasks: test-set-attribute-value.yml - include_tasks: test-set-children-elements.yml - include_tasks: test-set-children-elements-level.yml + - include_tasks: test-set-children-elements-value.yml - include_tasks: test-set-element-value.yml - include_tasks: test-set-element-value-empty.yml - include_tasks: test-pretty-print.yml diff --git a/tests/integration/targets/xml/tasks/test-set-children-elements-value.yml b/tests/integration/targets/xml/tasks/test-set-children-elements-value.yml new file mode 100644 index 0000000000..1f5bdd3df7 --- /dev/null +++ b/tests/integration/targets/xml/tasks/test-set-children-elements-value.yml @@ -0,0 +1,64 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + + - name: Setup test fixture + copy: + src: fixtures/ansible-xml-beers.xml + dest: /tmp/ansible-xml-beers.xml + + + - name: Set child elements + xml: + path: /tmp/ansible-xml-beers.xml + xpath: /business/beers + set_children: &children + - beer: + alcohol: "0.5" + name: 90 Minute IPA + +value: "2" + - beer: + alcohol: "0.3" + name: Harvest Pumpkin Ale + +value: "5" + register: set_children_elements_value + + - name: Add trailing newline + shell: echo "" >> /tmp/ansible-xml-beers.xml + + - name: Compare to expected result + copy: + src: results/test-set-children-elements-value.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: true + diff: true + register: comparison + + - name: Test expected result + assert: + that: + - set_children_elements_value is changed + - comparison is not changed # identical + + + - name: Set child elements (again) + xml: + path: /tmp/ansible-xml-beers.xml + xpath: /business/beers + set_children: *children + register: set_children_again + + - name: Compare to expected result + copy: + src: results/test-set-children-elements-value.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: true + diff: true + register: comparison + + - name: Test expected result + assert: + that: + - set_children_again is not changed + - comparison is not changed # identical