首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将XML节点替换为“复杂的”节点?

如何将XML节点替换为“复杂的”节点?
EN

Stack Overflow用户
提问于 2020-09-10 07:07:19
回答 2查看 232关注 0票数 0

如何使用xml模块(在运行两次时没有“更改”)以达到所需的示例状态?

示例:

初始状态,bar节点只包含文本:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <foo>foo</foo>
  <bar>bar</bar>
  <baz>baz</baz>
</root>

需要的状态,bar节点包含:

  • 各种节点
  • 该节点同时包含标记和文本

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <foo>foo</foo>
  <bar name="bar">
     <content name="1" type="text">lorem</content>
     <content name="2" type="yml">lorem: ipsum</content>
     </verbose>
  </bar>
  <baz>baz</baz>
</root>

我的尝试:

代码语言:javascript
复制
---
- hosts: localhost
  vars:
    xml_text: >-
      <?xml version='1.0' encoding='UTF-8'?>
      <root>
        <foo>foo</foo>
        <bar><barbar/></bar>
        <baz>baz</baz>
      </root>
  tasks:
    - name: "Substitute bar. Bad: wipes the other nodes"
      xml:
        xmlstring: "{{ xml_text }}"
        xpath: /root
        input_type: xml
        set_children: |-
          <bar>
            <verbose />
            <content name="1" type="text">lorem</content>
            <content name="2" type="yml">lorem: ipsum</content>
          </bar>
      register: result

    - debug:
        var: result

    # Imitating https://github.com/ansible-collections/community.general/blob/main/tests/integration/targets/xml/tasks/test-set-children-elements-level.yml
    - name: "Substitute bar. Bad: Can't do both tags ans values"
      xml:
        xmlstring: "{{ xml_text }}"
        xpath: /root/bar
        input_type: yaml
        set_children:
            - verbose: "1"
            - content:
                name: "1"
                type: text
            #     _ : lorem
            #     "": lorem
            #     ~ : lorem
            - content: "lorem: ipsum"
            #       name: 2
            #       type: yml
      register: result

    - debug:
        var: result

    - name: "Substitute bar. Bad: Fails"
      xml:
        xmlstring: "{{ xml_text }}"
        xpath: /root/bar
        input_type: xml
        set_children: |-
            <verbose />
            <content name="1" type="text">lorem</content>
            <content name="2" type="yml">lorem: ipsum</content>
      register: result

    - debug:
        var: result
EN

回答 2

Stack Overflow用户

发布于 2021-02-11 19:07:20

我认为您需要对XML内容使用空节点(key "_")。请参阅https://github.com/cmprescott/ansible-xml/issues/101

例如

代码语言:javascript
复制
- name: Configure proxy in maven
xml:
  path: /etc/maven/settings.xml
  namespaces:
    mvn: http://maven.apache.org/SETTINGS/1.0.0
  xpath: /mvn:settings/mvn:proxies
  pretty_print: yes
  set_children:
    - proxy:
        _:
          - id: "proxy"
          - active: "true"
          - protocol: "http"
          - host: '{{ proxied_proxy_node }}'
          - port: '{{ proxied_proxy_port | string }}'
when: maven_settings_file.stat.exists
票数 1
EN

Stack Overflow用户

发布于 2021-05-26 08:37:39

2021-05-26是不可能的。

一个bug正在打开,等待贡献者:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63824463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档