我有以下提到的xml:
<?xml version='1.0' encoding='UTF-8'?>`
<Envelope>
<Body>
<response>
<timestamp>2018-11-01T15:18:44-04:00</timestamp>
<content>`
<element1>value1</element1>
<element2>value2(/element2>
<element3>
<child1>c1</child1>
<child2>c2</child2>
</element3>
</content>
</response>
</Body>
</Envelope>
我必须捕获xml格式的content
标记子代才能对其进行编码。
当我使用xml模块获取内容及其后代时,将其捕获为词典列表。
我想要做的就是将content
捕获为
"<element1>value1</element1>
<element2>value2(/element2>
<element3>
<child1>c1</child1>
<child2>c2</child2>
</element3>"
作为字符串。
稍后,我将使用此字符串进行编码和解码。
我不想对content
的每个后代进行编码,而是对所有content
进行编码。
如何使用ansible实现此目的。 我正在使用ansible 2.4版
答案 0 :(得分:0)
基于阅读Ansible xml module,这似乎是不可能的。
您可以通过command
之类的实用程序来使用xmllint
模块,如下所示:
---
- name: run the playbook tasks on the localhost
hosts: 127.0.0.1
connection: local
tasks:
- name: Get Content Section
command: "xmllint --xpath '/Envelope/Body/response/content' --format test.xml"
register: out
- name: output
debug:
msg: "{{ out.stdout }}"
看起来像这样:
PLAY [run the playbook tasks on the localhost] ***************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************
ok: [127.0.0.1]
TASK [Get Content Section] ***********************************************************************************************************************
changed: [127.0.0.1]
TASK [output] ************************************************************************************************************************************
ok: [127.0.0.1] => {
"msg": "<content><element1>value1</element1><element2>value2</element2><element3><child1>c1</child1><child2>c2</child2></element3></content>"
}
PLAY RECAP ***************************************************************************************************************************************
127.0.0.1 : ok=3 changed=1 unreachable=0 failed=0
答案 1 :(得分:0)
您可以利用以下事实,即使用xml:
的 target python也必须可用(并且安装了lxml
蛋/滚轮,但我们不会这样做)为此不需要它):
vars:
name_of_the_xml_file: whatever-filename
tasks:
- command: '{{ ansible_python_interpreter }} -u - {{ name_of_the_xml_file }}'
args:
stdin: |
import sys
from xml.etree.ElementTree import parse, tostring
with open(sys.argv[1]) as fh:
doc = parse(fh)
c = doc.find('.//content')
print(tostring(c))
register: the_content
- debug: var=the_content.stdout